多线程锁的升级原理是什么
锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁
无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。
偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该线程再次进入同步块,无需再次获取锁,只需检查对象头的标记位即可。
偏向锁的撤销:当有其他线程尝试竞争偏向锁时,偏向锁会被撤销,升级为轻量级锁。撤销过程需要在安全点(Safe Point)进行,确保没有字节码正在执行。
轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。
重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。 重量级锁会导致线程上下文切换,开销较大。
锁的降级:JVM 并不支持锁的降级,即一旦锁升级为重量级锁,就不会再降级为轻量级锁或偏向锁。锁的升级是单向的,不可逆的。
总结
无锁:适用于读多写少的场景,或者对性能要求极高的场景。
偏向锁:适用于单个线程长时间持有锁的场景。
轻量级锁:适用于锁竞争不激烈的场景,通过自旋减少线程切换的开销。
重量级锁:适用于锁竞争激烈或锁持有时间较长的场景,确保线程的安全性和互斥性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了