synchronized 的实现

2019-05-05  本文已影响0人  Wi1ls努力努力再努力

在 Hotspot 虚拟机中,Java 对象头包含_mark 和_klass(继承自 OopDesc),其中synchronized 用的锁就是保存在_mark 中的。
synchronized 中锁的状态分为无锁/偏向锁/轻量级锁/重量级锁 四种状态。同时这几个状态随着竞争情况逐渐升级。并且锁可以升级但是无法降级。
同时编译器会清除一些使用了同步,但是代码块内却没有涉及同步数据的锁。


Java对象头Mark Word

实验来看看偏向锁下的 Mark Word 是什么样子的,JDB+HDSB
jsd 附带参数 -XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0表示开启偏向锁

public class Main {
  public static void main(String[] args) {
    Main main = new Main();
    main.addString("sss");
  }

  private List<String> list = new ArrayList<>();

  public void addString(String s) {
    synchronized (this) {
      list.add(s);
    }
  }

}

运行 jdb,在 list.add(s);加上断点


轻量级锁
上一篇下一篇

猜你喜欢

热点阅读