Synchronized优化

在jdk1.6之前,Monitor的实现完全是一句操作系统内部的互斥来实现的,当线程被挂起的时候,需要从用户态切换到内核,是重量级的操作

在1.6之后,对synchronized进行了优化操作,

JVM提供了三种不同的 Monitor 实现,也就是三种不同的锁:
偏向锁
轻量级锁
重量级锁
JVM根据不同的竞争状态自动切换不同的锁
 
1 无竞争出现  使用偏向锁
JVM 会使用 CAS 操作,在对象头的 Mark Word 部分设置 线程 ID,以表示这个
对象偏向于当前线程,所以并不涉及真正的互斥锁。这样做是假设很多场景中,
大部分对象的生命周期中最多会被一个线程锁定,因此可以降低无竞争开销,让线程获得锁的代价更低。
2 当有线程试图锁定已经被设置偏向锁的对象,此时会撤销对象的偏向锁
如果有另外的线程试图锁定某个已经被偏向的对象,JVM 就需要撤销该对象的偏向锁,并升级到轻量级锁。
轻量级锁依赖 CAS 操作对象头中的 Mark Word 来试图获取锁,如果成功则获得锁
3 如果获取轻量级锁失败则尝试自旋重试,重试失败后,则表示当前锁存在竞争,就会升级到重量级锁。

猜你喜欢

转载自www.cnblogs.com/bowenqianngzhibushiwo/p/11651390.html
今日推荐