深入分析 synchronized 的实现原理
记得刚刚开始学习 Java 的时候,一遇到多线程情况就是 synchronized ,相对于当时的我们来说 synchronized 是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。
但是,随着我们学习的进行我们知道 synchronized 是一个重量级锁,相对于 Lock ,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。
诚然,随着 Javs SE 1.6 对 synchronized 进行的各种优化后,synchronized 并不会显得那么重了。下面跟随 LZ 一起来探索 synchronized 的实现机制、Java 是如何对它进行了优化、锁优化机制、锁的存储结构和升级过程。
实现原理
- synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:
- 普通同步方法,锁是当前实例对象
- 静态同步方法,锁是当前类的 class 对象
- 同步方法块,锁是括号里面的对象
1)同步代码块是使用 monitorenter 和 monitorexit 指令实现的;
2)同步方法(在这看不出来需要看JVM底层实现)依靠的是方法修饰符上的ACC_SYNCHRONIZED 实现。