技术文摘
别再误解 synchronized 是重量级锁,看这篇文章
别再误解 synchronized 是重量级锁,看这篇文章
在 Java 多线程编程中,synchronized 关键字是常用的同步机制。然而,很多开发者对它存在一个常见的误解,认为它总是重量级锁,这其实是不准确的。
我们要明确重量级锁的概念。重量级锁是指在多线程竞争激烈的情况下,使用了操作系统层面的互斥量来实现同步,这种方式会带来较大的性能开销。
但 synchronized 并非一开始就是重量级锁。在 Java 中,synchronized 的实现是基于对象头中的标记位和 monitor 机制。当多个线程竞争不激烈时,它会采用偏向锁或者轻量级锁的方式来提高性能。
偏向锁是一种针对只有一个线程访问同步块的优化。当一个线程第一次获取锁时,会将对象头中的标记位设置为偏向该线程,后续该线程再次进入同步块时,无需进行额外的同步操作。
轻量级锁则是在多个线程竞争但不激烈的情况下使用。它通过 CAS 操作来尝试获取锁,如果获取成功则直接使用,否则会升级为重量级锁。
只有在多线程竞争非常激烈,轻量级锁的自旋操作达到一定次数仍无法获取锁时,synchronized 才会升级为重量级锁。
所以,不能一概而论地认为 synchronized 就是重量级锁。在实际开发中,我们需要根据具体的场景和线程竞争情况来评估其性能影响。
为了更好地理解和运用 synchronized,我们还需要考虑锁的粒度和锁的范围。过于粗粒度的锁可能会导致并发度降低,而过于细粒度的锁可能会增加锁竞争的开销。
对于 synchronized 锁的理解不能停留在简单的“重量级锁”的误区中。深入了解其内部实现机制和适用场景,才能在多线程编程中更好地发挥其作用,提高程序的性能和并发度。希望通过这篇文章,能让您对 synchronized 有更清晰、准确的认识,从而在编程实践中更加得心应手。
TAGS: 技术解析 文章解读 误解澄清 Synchronized 锁
- 计算机界最大追书坑 82 岁高德纳笔耕不辍
- Go 领先 Python ,机器学习人才奇缺,16655 位全球程序员透露真相
- Java 中对象不再使用却不赋值为 null 的后果
- Excel 遭遇大数据难题,Python 成拯救关键
- 我的 JavaScript 工具链:6 个变革性工具
- 怎样重构令人畏惧的代码
- 基于 Springboot 与 Dubbo 打造分布式微服务的全程注解开发
- 构建端到端 ML 框架失败原因及启示
- 老板,我不慎执行了 kill -9 命令
- VSCode 竟能画流程图 开源未达 10 天 Star 数近 5000
- 观脉科技依托自有 SD-WAN 网络 发力实时音视频领域助力全球战疫
- CSS 伪元素的少见应用实例
- 怎样“取巧”达成微前端沙箱
- 怎样使你的脚本随处可执行?
- 使用 target="_blank" 做网页外链引发的悲剧