synchronized原理
代码案例
package cn.knightzz.test;
/**
* @author 王天赐
* @title: TestSynchronizedSource
* @projectName hm-juc-codes
* @description: 测试Synchronized原理
* @website <a href="http://knightzz.cn/">http://knightzz.cn/</a>
* @github <a href="https://github.com/knightzz1998">https://github.com/knightzz1998</a>
* @create: 2022-07-08 21:11
*/
public class TestSynchronizedSource {
static final Object lock = new Object();
static int count = 0;
public static void main(String[] args) {
synchronized (lock) {
count++;
}
}
}
可以使用 jclasslib 插件查看字节码
![image-20220708212019978](https://i-blog.csdnimg.cn/blog_migrate/6771e3b145370733bb9c1270dc13c077.png)
可可以使用
- getstatic #2 <cn/knightzz/test/TestSynchronizedSource.lock : Ljava/lang/Object;>
- dup 复制
- astore_1
- 拿到锁的对象 lock 的引用地址, 并复制一份, 然后存储到临时变量 slot1
- monitorenter
- 将 lock对象的markword 置为monitor指针
- getstatic #3 <cn/knightzz/test/TestSynchronizedSource.count : I>
- iconst_1
- iadd
- count++ 操作
- putstatic #3 <cn/knightzz/test/TestSynchronizedSource.count : I>
- aload_1
- 拿到 slot1 中临时的 lock 引用地址
- monitorexit
- 将 lock对象monitor锁重置, 唤醒 EntryList
- goto 24 (+8)
- 跳转到 24行 处理异常情况
- astore_2
- 将异常对象存储到临时变量 2
- aload_1
- 加载 lock 引用地址
- monitorexit
- 将 lock对象monitor锁重置, 唤醒 EntryList
- aload_2
- athrow
- 抛出异常
- return