- 若对象为无锁状态,修改对象头中的锁状态为偏向锁,并在对象头中记录当前线程id;
- 若对象为偏向锁状态,检查对象头中的线程id是否与当前线程一致,如果一致则直接使用;
如果不一致则尝试竞争; - 检查对象头中记录的线程是否还存活,并继续持有当前对象:
3.1. 若继续持有:升级为轻量级锁,自旋尝试获取对象;
3.2. 若不存活或不再持有:修改对象为无锁状态,依照CAS规则尝试修改对象头内线程id为当前id,升级为偏向锁,获取对象; - 轻量级锁自旋超过一定测试次数,或者自旋过程中有其他线程参与竞争,则升级为重量级锁;
- 重量级锁由monitor决定将对象分配哪个线程。
2020-11-22
网友评论