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