0
点赞
收藏
分享

微信扫一扫

锁优化


锁优化

  • ​​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做的努力​​


举报

相关推荐

0 条评论