Java 锁
?Java 中的锁是在多线程环境下,保证共享资源健康,线程安全的一种手段
?线程操作某个共享资源之前,先对资源加一层锁,保证操作期间没有其他线程访问资源,操作完成后再释放锁
保持数据一致性的方法
- 事务管理:使用数据库事务来确保一组数据库操作要么全部成功提交,要么失败全部回滚
- 锁机制:使用锁来实现共享资源的并发访问
- 版本控制:通过乐观锁的方式,在更新数据时记录数据的版本信息,从而避免同时对同一数据进行修改
悲观锁
?顾名思义,它总是假设最坏的情况,认为所有资源都是不安全的,随时会被其他线程操作、更改,所以操作资源之前,必须加一把锁,防止其他线程访问(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)
Java 中悲观锁有哪些
- synchronized关键字
- Java 中的关键字,底层由JVM虚拟机实现的同步机制
- 使用方式:
- 修饰静态方法:锁住的是类,该类下创建的所有对象都被锁住
- 修饰实例方法:所住的是当前对象,当前对象所属类的其他对象不受影响
- 修饰代码块:根据代码块所在区域的不同,实现不同效果,静态代码块锁住的是类,实例代码块锁住的是对象
- AQS 框架
- AQS 是基于Java实现的一种抽象队列同步器框架
乐观锁
?它和悲观锁完全相反,它认为所有资源都是安全的,每个线程对资源的操作都符合预期,所以不需要对资源进行加锁,相比于悲观锁,乐观锁的性能要更好,因为它操作资源时,会采用一种确认机制(CAS机制)来确保所操作资源未被其他线程更改过
?实现方式:
- CAS 操作:CAS 是乐观锁的基础,Java提供了java.util.concurrent.atomic包,包含各种原子变量类,这些类使用CAS操作实现了线程安全的原子操作
- 版本号控制:增加一个版本号字段记录数据更新时的版本,每次更新时递增版本号,在更新数据时,同时对比版本号,如果与更新前版本号相同,则成功
- 时间戳:使用时间戳记录更新时间,更新数据时对比时间戳,相同则成功,若大于之前的时间戳,则更新失败
本文暂时没有评论,来添加一个吧(●'◡'●)