@@ -125,9 +125,7 @@ public class SynchronizedDemo {
125125
126126![ synchronized关键字原理] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/synchronized关键字原理.png )
127127
128- 从上面我们可以看出:
129-
130- ** ` synchronized ` 同步语句块的实现使用的是 ` monitorenter ` 和 ` monitorexit ` 指令,其中 ` monitorenter ` 指令指向同步代码块的开始位置,` monitorexit ` 指令则指明同步代码块的结束位置。**
128+ 从上面我们可以看出:** ` synchronized ` 同步语句块的实现使用的是 ` monitorenter ` 和 ` monitorexit ` 指令,其中 ` monitorenter ` 指令指向同步代码块的开始位置,` monitorexit ` 指令则指明同步代码块的结束位置。**
131129
132130当执行 ` monitorenter ` 指令时,线程试图获取锁也就是获取 ** 对象监视器 ` monitor ` ** 的持有权。
133131
@@ -137,7 +135,15 @@ public class SynchronizedDemo {
137135
138136在执行` monitorenter ` 时,会尝试获取对象的锁,如果锁的计数器为 0 则表示锁可以被获取,获取后将锁计数器设为 1 也就是加 1。
139137
140- 在执行 ` monitorexit ` 指令后,将锁计数器设为 0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。
138+ ![ 执行 monitorenter 获取锁] ( ./images/interview-questions/synchronized-get-lock-code-block.png )
139+
140+ 对象锁的的拥有者线程才可以执行 ` monitorexit ` 指令来释放锁。在执行 ` monitorexit ` 指令后,将锁计数器设为 0,表明锁被释放,其他线程可以尝试获取锁。
141+
142+
143+
144+ ![ 执行 monitorexit 释放锁] ( ./images/interview-questions/synchronized-release-lock-block.png )
145+
146+ 如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。
141147
142148#### 1.3.2. synchronized 修饰方法的的情况
143149
@@ -154,6 +160,8 @@ public class SynchronizedDemo2 {
154160
155161` synchronized ` 修饰的方法并没有 ` monitorenter ` 指令和 ` monitorexit ` 指令,取得代之的确实是 ` ACC_SYNCHRONIZED ` 标识,该标识指明了该方法是一个同步方法。JVM 通过该 ` ACC_SYNCHRONIZED ` 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。
156162
163+ 如果是实例方法,JVM 会尝试获取实例对象的锁。如果是静态方法,JVM 会尝试获取当前 class 的锁。
164+
157165#### 1.3.3.总结
158166
159167` synchronized ` 同步语句块的实现使用的是 ` monitorenter ` 和 ` monitorexit ` 指令,其中 ` monitorenter ` 指令指向同步代码块的开始位置,` monitorexit ` 指令则指明同步代码块的结束位置。
@@ -164,6 +172,8 @@ public class SynchronizedDemo2 {
164172
165173相关推荐:[ Java锁与线程的那些事 - 有赞技术团队] ( https://tech.youzan.com/javasuo-yu-xian-cheng-de-na-xie-shi/ ) 。
166174
175+ 🧗🏻进阶一下:学有余力的小伙伴可以抽时间详细研究一下对象监视器 ` monitor ` 。
176+
167177### 1.4. 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗
168178
169179JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。
0 commit comments