JVM学习(九):锁优化

1、高效并发是JDK1.5到JDK1.6的一个重要改进,出现了适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等一系列锁优化技术。

2、自旋锁与自适应自旋:

(1)自旋锁:互斥同步对性能最大的影响是阻塞的实现需要转入内核态完成,由于通常情况下共享数据的锁定状态只会持续很短的一段时间,如果让一个线程在等待获取锁的时候多等一会,占用CPU的执行时间但是不会进入阻塞状态,执行一个忙循环(自旋),即实现了自旋锁。

(2)自旋锁在JDK1.4.2中已经引入,自旋不能代替阻塞,因为自旋需要占用处理器时间,自旋等待的时间必须有限制,默认自旋次数为10次,可以使用参数-XX:PreBlockSpin设置。

(3)自适应自旋:JDK1.6引入了自适应的自旋锁,即自旋的时间不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果判断出自旋获取锁的成功概率大,则允许自旋等待较长时间,反之可能省略自旋过程直接进入阻塞,避免浪费处理器资源。

3、锁消除:虚拟机即时编译器在运行时,对于有些代码上同步,但被检测到不可能存在共享数据竞争的锁进行消除,无需同步直接执行。比如,JDK1.5之前String类的拼接使用了线程安全的StirngBuffer.append()方法,但是由于String是不可变类,所以代码编译之后就会进行锁消除操作。

4、锁粗化:虚拟机探测到如果有一系列的连续操作都对同一个对象反复加锁和解锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部,这样只需加锁一次就可以了。

扫描二维码关注公众号,回复: 7091362 查看本文章

5、轻量级锁:通过使用CAS操作避免互斥同步的开销,在没有多线程竞争的前提下,可以减少传统的重量级锁产生的性能消耗。

6、偏向锁:在无竞争的情况下把整个同步都消除掉,虚拟机通过参数-XX:+UseBiasedLocking(JDK1.6默认使用)设置。

7、锁的标记存放在HotSpot虚拟机对象头中(Mark Word):

存储内容 标志位 状态
对象哈希码、对象分代年龄 01 未锁定
指向锁记录的指针 00 轻量级锁定
指向重量级锁的指针 10 膨胀(重量级锁定
空,不需要记录信息 11 GC标记
偏向线程ID、偏向时间戳、对象分代年龄 01 可偏向


8、偏向锁存在竞争则撤销偏向可转为轻量级锁,轻量级锁膨胀升级为重量级锁

猜你喜欢

转载自www.cnblogs.com/xy80hou/p/11407365.html