1、sync的用法
1)access flag 方法
2)代码段(字节码会不一样)
monitorenter
monitorexit
3)unsafe.monitorEnter(Object var1)
unsafe.monitorExit(Object var1)
Unsafe 不能直接用,需要反射才可以
2对象的内存结构:
1)对象头区域:
Mark World
队形的C++类是哪个: markOopDesc
32位机器占 4字节
64位机器占 8字节
底层
类型指针:基于哪个类生成的对象
2)实例数据区域
实例数据
3)对齐填充区域
对齐填充
Padding
3,锁的类型:
无锁
匿名偏向
偏向锁
轻量级锁
重量级锁
4 匿名偏向锁
1)是什么
偏向锁的初始化
延迟偏向:4秒钟
col-core
maven
2)对比偏向锁:mark world 中的值对比
偏向锁
101 thread_id = 线程id
匿名偏向锁
101 thread_id = null
3)证明
如果要模拟出偏向锁,需要延迟4秒以上
5 无锁->轻量级锁
为什么:
锁膨胀机制
1)线程竞争
2)不得不
无锁时,执行到monitorEnter,如果偏向锁还没初始化,直接上轻量级锁
hashcode对锁的影响:
不管是什么锁,如果加了hashcode,一定是重量级锁
为什么:
轻量级锁的重入时,BasicOjbect.header置为null
重量级锁
6 轻量级锁的底层实现
锁撤销
偏向锁->恢复成无锁状态->重量级锁
轻量级锁->恢复成无锁状态->重量级锁
1)实现的基础
BasicOjbect
owner 关联这个锁的对象指针
header 存储无锁状态的Mark Word
(1)为了恢复成无锁状态做准备
(2)重入的标识
如果不是重入,存储的是无锁状态的Mark Word
如果是重入,置为null
2)存储在哪
栈中 是方法对应的栈帧中,。如何证明:HSDB
1,虚拟机栈中(线程栈中)
2,方法对应的栈帧中
7 重量级锁底层实现
底层实现是mutex
重量级锁,性能不高
因为:应用态 --> 内核态
寄存器,环境的切换
8 park unpark 底层调用的是 pthread_mutex_lock pthread_mutex_unlock