锁优化
- java代码层面的优化
- 减少锁持有的时间
- 减少锁粒度
- 锁分离
- 锁粗化
- 锁消除
- JVM层面的优化(锁升级)
- 偏向锁
- 轻量级锁
- 重量级锁
- 参考
java代码层面的优化
减少锁持有的时间
这个很好理解:根据需要,将加在普通方法上的锁,以代码块的方式对方法中的共享资源进行加锁。
减少锁粒度
比如将JDK1.7的concurrentHashMap的segment锁变成Node锁。以此来减少锁的粒度。增加并发。
锁分离
使用两把不同的锁实现了锁分离,比如LinkedBlockingQueue中的take和put分别使用takeLock和putLock。锁分离的思想:主要操作互不影响,就可以分离。
锁粗化
频繁对一个锁进行加锁和释放锁时,可以将所有锁操作的集合整合到一个锁请求下。
锁消除
当java虚拟机即时编译的时候,通过对上下文扫描,除去一些不可能存在共享资源竞争的锁。比如给linkedblockingqueue加锁。
JVM层面的优化(锁升级)
锁升级的流程是:
无锁状态 → 偏向锁状态 → 轻量级锁 → 重量级锁
这里的几个锁的标志位都在对象头的markword中。详情见对象头
偏向锁
当线程1获取锁对象以后,对象头的偏向锁记录会指向当前线程。当线程2来竞争获取锁资源时,首先查看锁记录中的线程是否为线程2,如果不是,那就就会查看锁记录中的线程1是否存活,如果未存活,则将锁记录指向当前线程。如果存活则升级成轻量级锁。
轻量级锁
通过cas来获取锁。优势在于不用阻塞线程,进而不需要cpu从用户态切换到内核态。缺点当获取不到锁时,cpu会自旋空转。当自旋次数过多,将会膨胀为重量级锁。重量级锁会将除已经在执行的线程以外的,其他线程进行阻塞。
自旋锁和自适应性自旋锁。
重量级锁
重量级锁-synchronized
参考
java锁优化锁的优化以及JVM做的努力