锁的优化过程

简介: 锁的优化过程

JVM 将 synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁状态。会根据情况, 依次进行升级

🔎无锁

线程之间不会引发安全问题,就不用加锁


🔎偏向锁

偏向锁不是真的 “加锁”, 只是先让线程针对锁做个标记(这个过程很快)

如果代码执行过程中没有其他线程来竞争这个锁, 那么就不用加锁

如果有其他线程竞争这个锁, 那么偏向锁就会真的加锁, 变成轻量级锁

偏向锁是synchronized内部做的工作

synchronized 会针对某个对象进行加锁, 偏向锁就是先去对加锁的对象做个标记

当有其他线程竞争这个锁时, JVM就会通知 偏向锁 升级成 轻量级锁


🔎轻量级锁

轻量级锁基于自旋锁实现

自旋锁

优点: 能够第一时间拿到锁

缺点: 一直消耗CPU,做不了其他事情(忙等)

如果锁竞争过于激烈(CPU消耗过大)

那么 synchronized 就会从 轻量级锁 升级成 重量级锁


🔎重量级锁

重量级锁基于挂起等待锁实现

挂起等待锁

优点: 不再消耗大量CPU资源

缺点: 锁被释放后不能第一时间拿到锁

当 synchronized 升级成重量级锁, 就意味着线程要暂时放弃 CPU, 由内核进行后续调度


🔎其他的锁优化

🌸锁消除

锁消除是编译器做的优化手段

非必要不加锁,

编译器发现代码不会引起线程安全问题却加锁的时候, 就会把锁给取消掉

举个栗子🥝

StringBuffer 是内部方法里面加了锁🔒

但是上述代码并不会引起线程安全问题

所以编译器就会进行优化(锁消除)


🌸锁粗化

锁粒度

synchronized 代码块中包含代码的多少

包含的代码越多, 锁粒度就越粗

包含的代码越少, 锁粒度就越细

一般写代码时, 希望锁的粒度细(代码块中包含的代码少)

这样串行的时间就会少一些, 并发的时间就会多一些

如果某个场景中涉及到频繁的加锁, 解锁操作

编译器就会将其优化, 优化成一个更粗粒度的锁

这就是锁粗化

该场景中由于涉及到频繁的加锁, 解锁操作
于是编译器就将其优化成了一个更粗粒度的锁

一个更粗粒度的锁

举个栗子🥝

滑稽老哥去给领导汇报工作

滑稽老哥给领导打电话汇报A工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥给领导打电话汇报B工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥给领导打电话汇报C工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥打电话汇报工作时, 此时如果有其他的电话打给领导, 只能阻塞等待

汇报完毕, 再次汇报时, 可能其他人也在给领导打电话, 滑稽老哥阻塞等待

滑稽老哥需要再次拨打电话汇报其他工作情况(重新竞争锁)

针对上述情况, 编译器将该操作优化成了一个更粗粒度的锁

滑稽老哥向领导依次汇报A, B, C工作情况, 而不是分别打电话进行汇报

(滑稽老哥打电话给领导, 汇报工作A, B, C的情况, 挂断电话)

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
28天前
|
安全 Java 编译器
Java并发编程中的锁优化策略
【5月更文挑战第30天】 在多线程环境下,确保数据的一致性和程序的正确性是至关重要的。Java提供了多种锁机制来管理并发,但不当使用可能导致性能瓶颈或死锁。本文将深入探讨Java中锁的优化策略,包括锁粗化、锁消除、锁降级以及读写锁的使用,以提升并发程序的性能和响应能力。通过实例分析,我们将了解如何在不同场景下选择和应用这些策略,从而在保证线程安全的同时,最小化锁带来的开销。
|
13天前
|
缓存 算法 Java
深入解析线程上下文切换的原理与优化策略
深入解析线程上下文切换的原理与优化策略
18 0
|
1月前
|
Java
【专栏】Java多线程中,锁用于控制共享资源访问,确保数据一致性和正确性,锁是什么意思,有哪些分类?
【4月更文挑战第28天】Java多线程中,锁用于控制共享资源访问,确保数据一致性和正确性。本文探讨锁的概念、作用及分类:乐观锁与悲观锁、自旋锁与适应性自旋锁、公平锁与非公平锁、可重入锁和读写锁。使用锁需注意避免死锁、合理选择锁粒度及性能优化。理解锁有助于提升多线程编程的效率和稳定性。
|
10月前
什么条件下会产出死锁,如何避免死锁?
一个去美团面试的小伙伴私我说,被面试官问到一个死锁的问题难道了,面试前还特意刷了题,面试的时候就是脑子一片空白不知道怎么回答。今天,我给大家彻底讲明白。
63 1
什么条件下会产出死锁,如何避免死锁?
|
11月前
|
缓存 监控 算法
内容服务锁优化实践
内容服务锁优化实践
70 0
|
并行计算 安全 算法
Oh!老伙计,提高自己的并发技能,先从锁优化开始吧
锁是最常用的同步方法之一。在高并发的环境下,激烈的锁竞争会导致程序的性能下降。 对于单任务或者单线程的应用而言,其主要资源消耗都花在任务本身,它既不需要维护并行数据结构间的一致性状态,也不需要为线程的切换和调度花费时间。对于多线程应用来说,系统除了处理功能需求外,还需要额外维护多线程环境的特有信息,如线程本身的元数据、线程的调度、线程上下文的切换等。并行计算之所以能提高系统的性能,并不是因为它"少干活"了,而是因为并行计算可以更合理地进行任务调度,充分利用各个CPU资源。
|
SQL 运维 监控
锁优化|学习笔记
快速学习锁优化
81 0
|
存储 Java
锁的优化机制
从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量 级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。
199 0
锁的优化机制
|
Java
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销(上)
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销
289 0
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销(上)
|
Java
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销(下)
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销
321 0
JVM 内置锁 synchronized 关键字,偏向锁优化中的批量重偏向和批量撤销(下)