【】Synchronized锁升级的原理与高手

你好,我是麦克

一个工作了7年的粉丝来找我说他最近被各种锁弄晕了。

例如共享锁、排他锁、偏向锁、轻量级锁、自旋锁、重量级锁,

间隙锁、近键锁、意向锁、读写锁、乐观锁、悲观锁、表锁、行锁。

然后我前两天去面试,被问到对锁和轻量锁的偏好,但我没有回答。

好的,关于同步锁升级的原理,看普通人和专家的解答。

普通人:

我认为引入这些锁的目的应该是考虑到性能问题。

因为我记得好像说如果给Synchronized加个重量级锁,它的线程就会有这个阻塞,会影响性能。因此,引入了偏向锁机制。

那么升级就是我们在获取锁的时候,以偏向锁、轻量级锁和重量级锁的方式来争夺锁。

大师:

好的,面试官。

jdk之前的同步1.6版本使用重量级锁来实现线程间的锁竞争。

之所以称为重量级锁,是因为它的底层依赖于操作系统的互斥锁来实现互斥功能。

图片[1]-【】Synchronized锁升级的原理与高手-唐朝资源网

Mutex 是一种系统方法。由于权限隔离,应用在调用系统方法时需要切换到内核态执行。

这涉及到从用户态到内核态的切换,会带来性能损失。

在 jdk1. 版本 6 中,synchronized 增加了锁升级机制来平衡数据安全性和性能。简单来说,当一个线程访问一个同步代码块时,synchronized是基于

在线程竞争的情况下,会先尽量保证线程安全,不加重量级锁。因此,引入了偏向锁和轻量级锁的机制。

偏向锁是将当前锁直接偏向某个线程。简而言之,就是通过 CAS 来修改偏向的锁标记。这种锁适用于同一个线程多次申请同一个锁资源且没有其他线程竞争的场景。 .

轻量级锁也可以称为自旋锁,它基于一种自适应自旋机制,通过多次自旋重试来竞争锁。自旋锁的优点是避免了从用户态切换到内核态带来的性能开销。

After Synchronized引入锁升级机制,如果有线程争抢锁:

​ 首先,synchronized会尝试使用偏向锁来竞争锁资源。如果偏向锁可以竞争,则说明锁成功返回,直接返回。如果竞争锁失败,说明当前锁已经偏向其他线程。

​ 锁需要升级为轻量级锁。在轻量级锁状态下,竞争锁的线程会根据自适应自旋的次数来尝试抢占锁资源。如果轻量级锁状态锁仍然没有竞争,

​只能升级为重量级锁。在重量级锁状态下,不竞争锁的线程会被阻塞,线程状态为Blocked。

​处于锁等待状态的线程需要等待获得锁的线程触发唤醒。

总的来说,Synchronized的锁升级的设计思路,在我看来,本质上是性能和安全之间的平衡,即如何在不加锁的情况下保证线程安全。

这种思维在编程领域很常见。比如Mysql中的MVCC就是使用版本链的方式来解决多个并行事务的竞争问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞266 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片