Java虚拟机的锁优化

JDK内部的优化策略主要包括以下几点

  1. 锁偏向
  2. 轻量级锁
  3. 自旋锁
  4. 锁消除

1.锁偏向

锁偏向是一种针对加锁操作的优化手段。其思想为:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样可以节省大量有关锁申请的操作,从而提高程序性能。

适用场景:几乎没有锁竞争的场合,因为连续多次极有可能是同一个线程请求相同的锁

如何启用?

-XX:+UseBiasedLocking

2. 轻量级锁

如果偏向锁失败,虚拟机并不会立即挂起线程,它还会使用一种称为轻量级锁的优化手段。
//todo

3. 自旋锁

当线程暂时无法获得锁时,系统乐观的认为该线程将在不久的将来得到锁,因此,虚拟机将会让该线程做几个空循环而非挂起,如果经过几个空循环后,得到了锁,则顺利进入临界区,如果还不能获得锁,则将线程在操作系统层面挂起。

4. 锁消除

Java虚拟机在编译时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。通过锁消除,可以节省毫无意义的请求锁时间。

这里消除的锁可能包括程序员的不当加锁,更主要的则是对一些内置API进行优化。很多线程安全的类型是通过加锁来实现的,但是在实际使用中,可能并不存在并发冲突问题,则Java虚拟机会去除无用的锁。

锁消除涉及一项关键技术,逃逸分析。逃逸分析是指观察某一个变量是否会逃出一个作用域。进行逃逸分析需要在-server模式进行,可以使用-XX:+DoEscapeAnalysis参数来打开。

如何启用?

-XX:+EliminateLocks

你可能感兴趣的:(Java虚拟机的锁优化)