synchronized
2020-03-10 17:31:31 11 举报
synchronized 原理图
作者其他创作
大纲/内容
线程访问同步代码块
不等于,代表偏向锁失效
对齐填充
挂起原持有偏向锁的线程
拷贝对象头中的 Mark Word到原持有偏向锁线程的锁记录中
从安全点继续执行
失败
是
CAS操作1&21.对象头中的 Mark Word中锁记录指针是否仍然指向当前线程锁记录2.拷贝在当前线程锁记录的 Mark Word信息是否与对象头中的 Mark Word一致
MarkWord
当前线程的栈中分配锁记录
转变为重量级锁指向重量级锁 monitor的指针|(标志位)10
GC分代年龄
判断epoch是否等于Obj类型的Class实例中的epoch
原持有偏向锁线程到达全局安全点(这个点没有正在执行的代码)
吵醒被挂起的那些线程
原持有偏向锁线程获得轻量级锁指向原持有偏向锁线程锁记录的指针|(标志位)00
对象头Header,数组类型含length,非数组类型不含length
轻量级锁00(标志位)
升级轻量级锁
mutex挂起当前线程
呼醒原持有偏向锁的线程
锁状态标志
偏向线程ID
再尝试
检测偏向锁指向的线程是否还在运行
偏向时间戳
线程持有的锁
原持有偏向锁的线程的栈中分配锁记录
释放锁
执行同步代码块
MarkWord偏向标志位
自旋
自旋达到一定次数 CAS 操作依然没有成功,默认 10 次
否
length
等于
拷贝对象头中的 Mark Word 到当前线程的锁记录中
开始轻量级锁解锁
重量级锁10(标志位)
对齐填充(Padding) 非必须
开始新一轮锁竞争
Synchronized原理
实例数据区
对象类型class中的bias设置是否允许偏向锁特性
获得偏向锁Thread Id | epoch | age | (是否偏向锁) 1 | (标志位)01
继续判断该线程是否还在持有锁
不等于
成功
CAS 操作将对象投的 Mark Word 中锁记录指针指向当前线程锁记录
1(偏向锁状态)
Pointer(类型指针)
原持有偏向锁线程
目前锁状态?
CAS操作替换Thread Id
升级为重量级锁
0(无锁状态)
存储对象自身的运行时数据
获得轻量级锁指向当前线程锁记录的指针 | (标志位)00
实例数据(Instance Data)
哈希码(Hashcode)
检查MarkWord中线程ID是否等于当前线程Id
01(标志位)
开始出现锁竞争、偏向锁撤销
收藏
0 条评论
下一页