jvm中锁的优化
除了上一篇提到通过锁膨胀来对锁机制进行优化外,还存在:
1.自旋锁(轻量级锁中用到了)
线程未获得资源时,不直接阻塞,而是通过执行一段空循环,来等待锁释放,然后获取锁,若执行了指定的循环次数后,线程还是没有获得锁资源,会被挂起。这种适用于不是很多线程,每个线程的执行时间很短。
2.自适应自旋锁
是对自旋锁的优化,通过前一个线程在该锁上的自旋时间和锁拥有者的状态来决定自旋次数
3.锁消除
当不存在多线程对资源的竞争,jvm会自动剔除该共享资源的锁,把这段共享资源当作线程私有资源来用。
4.锁粗化
当存在对一个对象连续的加锁,释放锁,或在循环内部对该对象加锁,则可以将该锁扩展为一个大锁,避免不断的锁的获得,释放过程。
5.分段加锁(锁细化)
典型的例子是concurrentHashMap的锁分段技术,对一段数据添加多段锁,(例如A,B段)一个线程在对A端段进行写入时,另一个线程完全可以操作B段,因为其对应不同的锁。这样能大大提高多线程的执行效率。
6.读写分离
典型的例子是concurrent包下的ReadWriteLock,此锁通过添加一个读锁(共享锁),写锁(互斥锁)来提高多线程的访问效率。
还有很多锁优化的方法,这需要具体情况具体说明,例如锁粗化和细化对应的情况是不同的。