Syncronized锁升级的过程
目录
升级过程:
无锁 → 偏向锁 → 轻量级锁 → 重量级锁
https://juejin.cn/post/6988869083521351711
无锁
没有开启偏向锁的状态,JDK1.6之后偏向锁是默认开启的,但是还有一个偏向延迟,需要在JVM启动之后的多少秒之后才能开启,这个可以通过JVM参数进行设置,同时是否开启偏向锁也可以通过JVM参数设置
偏向锁
在偏向锁开启之后锁的状态,如果没有一个线程拿到这个锁的话,这个状态叫做匿名偏向,当一个线程拿到偏向锁的时候,下次想要竞争锁,只需要拿线程ID跟markword当中存储的线程ID进行比较,如果线程ID相同就直接获取锁(相当于锁偏向这个线程),不需要进行CAS操作和将线程挂起的操作。
轻量级锁
这个状态下线程主要是通过CAS操作实现的,将对象的Markword存储到线程的虚拟机栈上,然后通过CAS将对象的markword内容设置为指向Displaced Mark Word的指针,如果设置成功则获取锁。
在线程处临界区的时候,也需要使用CAS,如果CAS替换成功则同步成功,如果失败表示有其他线程在获取锁,那么就需要在释放锁之后将被挂起的线程唤醒。
重量级锁
如果轻量级锁自旋到达阈值后仍未获取到锁,就会升级为重量级锁。这是因为CAS操作失败时会持续自旋,进行while循环操作,非常消耗CPU资源。而升级为重量级锁后,线程会被操作系统调度并挂起,从而节约CPU资源