synchronized优化轻量级锁
使用场景
如果一个对象虽然有多个线程访问,但多线程访问时间是错开的,也就是没有竞争,那么可以使用轻量级锁优化;
原理
1、每个线程的栈帧中有锁记录
包括:记录锁对象的地址Object reference、锁记录地址;
2、锁对象指针尝试执行对象;
锁记录地址和mark word 尝试AQS完成交换;
3、如果CAS成功,标志位由00变为01表示加锁
4、如果失败,那么有两种情况;
4.1如果是其他线程已经持有了改锁对象,那么表示有竞争进入锁膨涨;
4.2如果是自己执行了synchronized锁重入,那么lock record记录加1;
锁记录record如果为null,表示还不是最后一层加的锁直接record记录减1;
锁记录record如果不为null,那么在完成释放锁的时候锁记录需要和mark word 尝试AQS交换回来;