Synchronized优化
Posted bowenqianngzhibushiwo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Synchronized优化相关的知识,希望对你有一定的参考价值。
在jdk1.6之前,Monitor的实现完全是一句操作系统内部的互斥来实现的,当线程被挂起的时候,需要从用户态切换到内核,是重量级的操作
在1.6之后,对synchronized进行了优化操作,
JVM提供了三种不同的 Monitor 实现,也就是三种不同的锁:
偏向锁
轻量级锁
重量级锁
JVM根据不同的竞争状态自动切换不同的锁
1 无竞争出现 使用偏向锁
JVM 会使用 CAS 操作,在对象头的 Mark Word 部分设置线程 ID,以表示这个
对象偏向于当前线程,所以并不涉及真正的互斥锁。这样做是假设很多场景中,
大部分对象的生命周期中最多会被一个线程锁定,因此可以降低无竞争开销,让线程获得锁的代价更低。
2 当有线程试图锁定已经被设置偏向锁的对象,此时会撤销对象的偏向锁
如果有另外的线程试图锁定某个已经被偏向的对象,JVM 就需要撤销该对象的偏向锁,并升级到轻量级锁。
轻量级锁依赖 CAS 操作对象头中的 Mark Word 来试图获取锁,如果成功则获得锁
3 如果获取轻量级锁失败则尝试自旋重试,重试失败后,则表示当前锁存在竞争,就会升级到重量级锁。
以上是关于Synchronized优化的主要内容,如果未能解决你的问题,请参考以下文章