线程的使用带来的线程安全性问题
2022-06-09 21:29:29 0 举报
登录查看完整内容
为你推荐
查看更多
线程的使用带来的线程安全性问题, Synchronized、同步锁、锁升级
作者其他创作
大纲/内容
读取i到寄存器
写回内存
i=0
局部变量表
hashCode
i++操作的底层原理
JVM内存
失败
Thread1
检查原持有偏向锁的线程状态
3. mov dword ptr...把结果写回内存
2. CPU1开始执行
monitor
对象标记(markOop)
(markOop)-8个字节
获得轻量级锁指向当前线程锁记录的指针|epoch|(lock)00
程序员A
i=1
当前线程栈的分配锁记录
CPU
markword
锁监视器
线程1
method(){ Hello h=new Hello();}
gc年龄
结束
1. mov edi dwrod ptr...把内存中的数据加载到CPU集群器edi
是否替换成功
堆内存
存储容量
classloader类加载后
PC
i+1
排队等待
程序员C
repo=10
2. 通过数据总线从内存读取repo这个变量的值
成员属性o,对象引用占4个字节
否
执行repo=10-1写回到内存
Thread2
方法区<元空间实现>
线程4
入栈
抢占锁成功
0
OOP实例instanceOopDesc
类元信息_metadata
程序员B
线程访问同步代码块
是否为偏向锁
获取轻量级锁
是否为偏向锁升级
原持有偏向锁的线程栈中分配锁记录
锁标记
CPU1
new Hello()
升级为轻量级锁
SynchronizedDemo
1. 待执行的指令
heap内存
获得偏向锁Thread ID|epoch|(biased_lock)1|(lock)01
多线程对同一个共享变量的操作,带来的数据安全性问题。
编译
有锁状态
int a=1;
Thread1和Thread2不互斥,因为是两个锁对象
Thread1和Thread2互斥
竞争锁
升级为重量级锁
i=2
Hello.class
执行i++代码
实例数据
元数据指针
持有锁的线程能访问
撤销偏向锁并重新偏向
锁的作用范围图解
CPU0
CPU切换指令执行暂停
Hello类的OOP实例
register
执行同步代码
2. 待执行的指令
未活动/已退出同步代码块
klass pointer - 4个字节(开启压缩的情况)
拷贝对象头中的Mark Word到当前线程的锁记录中
自旋操作
markOop
重量级锁加锁
lock_flag=0
是
1. CPU0开始执行
成功
开始撤销偏向锁
.......
ALU
CAS操作
method
检查对象头MarkWord中的ThreadID是否等于当前线程ID
无锁状态
多线程竞争带来的安全性问题
支持偏向锁?
i
CAS替换Thread ID
线程2
栈帧
[对齐填充]
根据当前锁标识竞争对应的锁类型
instanceOopDesc
自旋指定次数仍然没有成功
判断lock_flag是否为0
线程3
暂停原持有偏向锁的线程
偏向锁的流程图
Class类的OOP实例
抢占锁失败
Hello类的InstanceKlass
时间轴
......
i=1
原持有偏向锁的线程达到全局安全点
获得重量级锁指向重量级锁的monitor的指针|epoch|(lock)10
字段、方法、接口、运行时常量池
[对齐填充],0字节
run
edi
锁状态
指向
data1
未退出同步代码块
本地内存
2. inc edi
1
线程5
data2
0 条评论
回复 删除
下一页