1 本地锁
1 sychronized的偏向锁
(1)为什么一开始设置它? 因为在获取monitor的时候,可以防止同一线程再次获取该锁时,执行CAS操作。 (2)为什么又废弃? 因为他的撤销并不是恢复到无锁状态,而是出现竞争时直接升级为轻量级锁。 此时需要找一个全局安全点(stop the world),看查看偏向的线程是否存活,如果已经死亡,则直接撤销偏向锁,然后slowenter。JVM维护了一个集合存放所有存活的线程,通过遍历该集合判断某个线程是否存活。 偏向的线程是否还在同步块中,如果不在,则撤销偏向锁。
锁消除:对一些代码上要求同步,但是检测出来实际用不到竞争的锁进行消除。通过逃逸分析来检测,比如局部变量,就不需要去进行加锁。
-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks
锁粗化:在一个连续操作中,对一个对象进行反复加锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部(由多次加锁编程只加锁一次)。
前提:中间不需要加锁的流程可以快速的完成。
减少锁持有的时间/减少锁粒度:在方法没有必要做同步的时候,不需要放在同步代码库快中,等待的时间就会变少,自旋成功的可能性就会变大。