题目描述
个人回答
心理:啊?啥?锁?还升级。
回答:不好意思,这个不会。
默默离开。
知识整理
四种锁状态简介
- 无锁状态:就是没有加锁,就没有synchronize()过
- 偏向锁:只有一个线程访问同步代码块时
- 轻量级锁(自旋锁):线程不太多,竞争不太激烈时使用
- 重量级锁:竞争激烈时,需要切换内核态
记录锁的位置
synchronize关键给某个对象上锁的方式就是修改该对象在内存中的对象头中Mark Word信息。
锁升级过程
- 对象刚刚被创建,Mark Word中的锁标志位为 01 ,是否偏向锁 0。
- 对象被synchronize关键字使用,当第一个线程进入后,锁升级为偏向锁,是否偏向锁 1。并且当前线程的指针被记录到该对象的Mark Word中。
- 有两个及以上的线程共同去执行同步代码块了。此时使用轻量级锁了,自旋锁(准确的说应该是自适应锁),两个线程通过CAS将,MarkWord中指向线程栈中Lock Record指针