如何深入解析并优化老式synchronized锁?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3012个文字,预计阅读时间需要13分钟。
我们知道+synchronized关键字可以实现线程安全,但你是否了解其背后的原理呢?今天我们就来探讨一下+synchronized实现线程同步背后的原因,以及相关的锁优化策略。
我们都知道 synchronized 关键字能实现线程安全,但是你知道这背后的原理是什么吗?今天我们就来讲一讲 synchronized 实现线程同步背后的原因,以及相关的锁优化策略吧。
synchronized 背后的原理synchronized 关键字经过编译之后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令,这两个字节码只需要一个指明一个要锁定或解锁的对象。如果 Java 程序中指明了对象参数,那么就用这个对象作为锁。
如果没有指定,那么就根据 synchronized 修饰的是实例方法还是类方法,去拿对应的对象实例或 Class 对象来作为锁对象。因此我们可以知道,synchronized 关键字实现线程同步的背后,其实是 Java 虚拟机规范对于 monitorenter 和 monitorexit 的定义。
在 Java 虚拟机规范对 monitorenter 和 monitorexit 的行为描述中,有两点需要特别注意。
- synchronized 同步块对同一条线程是可重入的,也就是不会出现自己把自己锁死的问题。
本文共计3012个文字,预计阅读时间需要13分钟。
我们知道+synchronized关键字可以实现线程安全,但你是否了解其背后的原理呢?今天我们就来探讨一下+synchronized实现线程同步背后的原因,以及相关的锁优化策略。
我们都知道 synchronized 关键字能实现线程安全,但是你知道这背后的原理是什么吗?今天我们就来讲一讲 synchronized 实现线程同步背后的原因,以及相关的锁优化策略吧。
synchronized 背后的原理synchronized 关键字经过编译之后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令,这两个字节码只需要一个指明一个要锁定或解锁的对象。如果 Java 程序中指明了对象参数,那么就用这个对象作为锁。
如果没有指定,那么就根据 synchronized 修饰的是实例方法还是类方法,去拿对应的对象实例或 Class 对象来作为锁对象。因此我们可以知道,synchronized 关键字实现线程同步的背后,其实是 Java 虚拟机规范对于 monitorenter 和 monitorexit 的定义。
在 Java 虚拟机规范对 monitorenter 和 monitorexit 的行为描述中,有两点需要特别注意。
- synchronized 同步块对同一条线程是可重入的,也就是不会出现自己把自己锁死的问题。

