死磕Synchronized底层实现
共 8785字,需浏览 18分钟
· 2021-02-11
阅读本文大概需要 2.8 分钟。
来自:http://suo.im/6h5g96
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/9ce27f0a4683
一、synchronized简介
public class SyncTest {
public void syncBlock(){
synchronized (this){
System.out.println("hello block");
}
}
public synchronized void syncMethod(){
System.out.println("hello method");
}
}
{
public void syncBlock();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=1
0: aload_0
1: dup
2: astore_1
3: monitorenter // monitorenter指令进入同步块
4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3 // String hello block
9: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: aload_1
13: monitorexit // monitorexit指令退出同步块
14: goto 22
17: astore_2
18: aload_1
19: monitorexit // monitorexit指令退出同步块
20: aload_2
21: athrow
22: return
Exception table:
from to target type
4 14 17 any
17 20 17 any
public synchronized void syncMethod();
descriptor: ()V
flags: ACC_PUBLIC, ACC_SYNCHRONIZED //添加了ACC_SYNCHRONIZED标记
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #5 // String hello method
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
https://blog.csdn.net/luoweifu/article/details/46613015
二、锁的几种形式
https://github.com/farmerjohngit/myblog/issues/8
1.对象头
2.重量级锁
3.轻量级锁
加锁过程:
解锁过程:
4.偏向锁
import java.util.ArrayList;
import java.util.List;
public class SyncDemo1 {
public static void main(String[] args) {
SyncDemo1 syncDemo1 = new SyncDemo1();
for (int i = 0; i < 100; i++) {
syncDemo1.addString("test:" + i);
}
}
private List<String> list = new ArrayList<>();
public synchronized void addString(String s) {
list.add(s);
}
}
对象创建
加锁过程
解锁过程
批量重偏向与撤销
https://blog.csdn.net/ITer_ZC/article/details/41892567
https://www.oracle.com/technetwork/java/biasedlocking-oopsla2006-wp-149958.pdf
三、总结
推荐阅读:
“华为天才少年”自制百大Up奖杯,网友:技术难度不高侮辱性极强
@Autowire和@Resource注解使用的正确姿势,别再用错的了!!
微信扫描二维码,关注我的公众号
朕已阅