文章目录
- CAS优化
- sychronized优化
CAS优化
CAS 优化过程:
CAS是一种乐观锁机制,它通过比较内存中的值与预期值是否一致来决定是否更新。如果一致,则更新;如果不一致,则说明有其他线程修改了该值,CAS操作失败,通常需要从新操作。
CAS的优化主要体现在减少了锁的开销,避免了线程阻塞,提高了并发性能。然而,CAS也存在一些问题,例如ABA问题(ABA问题指一个值被修改为另一个值,然后再修改回原来的值,CAS检测不到这种变化)以及循环自旋带来的性能损耗。
为了解决ABA问题,给要修改的数据引入版本号在CAS比较数据当前值和旧值的同时,也要比较版本号是否符合预期,如果发现当前读到的版本号一致,就真正执行修改操作,并让版本号自增;如果当前版本号比之前读到的版本号大,就认为操作失败。
sychronized优化
加锁⼯作过程:JVM 将 synchronized 锁分为 ⽆锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况,进⾏依次升级。
synchronized 关键字在 JDK 1.6 之后进行了显著的优化,其优化过程主要体现在锁升级机制上,从无锁状态逐步升级到偏向锁、轻量级锁,最后才是重量级锁。
无锁状态: 对象的 Mark Word 中不存储锁信息。
偏向锁: 当一个线程访问同步块并获取锁时,JVM 会在对象头 Mark Word 中存储该线程的 ID,后续该线程再次访问时无需竞争锁。这是一种优化,减少了无竞争情况下的锁开销。 如果其他线程尝试访问,则偏向锁升级为轻量级锁。
轻量级锁: 如果多个线程竞争锁,偏向锁升级为轻量级锁。轻量级锁使用 CAS 操作来尝试获取锁,如果 CAS 成功,则线程获得锁;如果失败,则轻量级锁升级为重量级锁。轻量级锁避免了重量级锁的系统调用开销。
重量级锁: 当轻量级锁竞争激烈时,锁升级为重量级锁,此时会使用操作系统提供的互斥锁来实现同步,性能开销较大。 这通常发生在高并发场景下。
锁消除:
定义:锁消除是指在编译时,JVM分析代码并消除不必要的锁。它的基本思想是,如果在某个代码块中,锁只被一个线程使用,并且没有其他线程访问共享资源,那么这个锁就可以被消除。
工作原理:当JVM编译器分析代码时,如果发现某个对象的锁只在一个线程中被使用,并且没有其他线程访问这个对象,那么它可以安全地消除这个锁。例如,在一个方法中,如果一个局部变量只在该方法内部使用,并且没有被其他线程共享,那么对这个局部变量的synchronized锁就可以被消除。
锁粗化:
定义:锁粗化是指将多个连续的synchronized块合并为一个更大的synchronized块,以减少锁的获取和释放次数。
工作原理:
当JVM发现多个synchronized块是对同一个对象的锁,并且这些块是连续的(即没有其他代码插入),它可以将这些块合并为一个大的synchronized块。
这样做的好处是减少了锁的获取和释放次数,从而降低了上下文切换的开销。