多线程锁的升级原理是什么

  

锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁

 

无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  

 

偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该线程再次进入同步块,无需再次获取锁,只需检查对象头的标记位即可。

 

偏向锁的撤销:当有其他线程尝试竞争偏向锁时,偏向锁会被撤销,升级为轻量级锁。撤销过程需要在安全点(Safe Point)进行,确保没有字节码正在执行。  

 

轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。

 

重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。 重量级锁会导致线程上下文切换,开销较大。

 

锁的降级:JVM 并不支持锁的降级,即一旦锁升级为重量级锁,就不会再降级为轻量级锁或偏向锁。锁的升级是单向的,不可逆的。

 

总结

无锁:适用于读多写少的场景,或者对性能要求极高的场景。

偏向锁:适用于单个线程长时间持有锁的场景。

轻量级锁:适用于锁竞争不激烈的场景,通过自旋减少线程切换的开销。

重量级锁:适用于锁竞争激烈或锁持有时间较长的场景,确保线程的安全性和互斥性。

  

posted @ 2024-11-11 16:09  CodeWhisperer001  阅读(21)  评论(0编辑  收藏  举报