synchronized
早期属于重量级锁------需访问OS
后期改进,有了锁升级的概念
偏向锁
线程第一次进入时,只有一个线程,没有线程竞争,此时维护锁会有资源浪费,因此只需要通过MarkWord记录第一个线程的id,记录成功则获取锁成功,记录锁状态为偏向锁。之后若当前线程与记录线程id相同,就可以直接获得锁,否则说明有其它线程竞争,膨胀为轻量级锁
轻量级锁
当前争用线程与MarkWord记录线程id不一致时,争用线程通过CAS竞争机制自旋等待锁释放,若自旋期间锁被释放,争用线程获取锁成功,此时所有操作在CPU完成,锁状态为轻量级锁。若争用线程自旋期间获取锁失败,膨胀为重量级锁
重量级锁
争用线程自旋获取失败后,争用线程进入内存阻塞等待,阻塞线程不消耗CPU,但是阻塞或唤醒一个线程时,都需要操作系统的帮忙,涉及到用户态和内核态的切换,转换状态比较耗时,所以重量级锁开销较大
锁升级过程
无锁 --> 偏向锁 --> 轻量级锁 --> 重量级锁
应用场景
1)自旋锁
执行时间短(加锁代码)、线程数较少
2)重量级锁
执行时间长、线程数较多

未命名图片.png