关于java:mca马士兵2021高级互联网架构师synchronized膨胀升级

20次阅读

共计 1054 个字符,预计需要花费 3 分钟才能阅读完成。

synchronized 收缩降级

对于 synchronized 这个关键字,可能之前大家有听过,他是一个重量级锁,依附底层操作系统的 Mutex lock(互斥锁)实现,开销很大,倡议大家少用点。但大家可能也据说过,但到了 jdk1.6 之后,该关键字被进行了很多的优化,曾经不像以前那样不给力了,倡议大家多应用。

那么它是进行了什么样的优化呢?

锁降级过程不可逆!


JDK1.6 版本之后对 synchronized 的实现进行了各种优化,如自旋锁、偏差锁和轻量级锁

并默认开启偏差锁

开启偏差锁:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

敞开偏差锁:-XX:-UseBiasedLocking

再介绍这些锁之前,须要理解一个概念:Java 对象头

synchronized 是乐观锁,在操作同步资源之前须要给同步资源先加锁,这把锁就是存在 Java 对象头里的,这个对象头长什么样呢?下图以 32 位 JVM 中存储内容为例

上面看一下锁的降级过程

无锁

无锁没有对资源进行锁定,所有的线程都能拜访并批改同一个资源,但同时只有一个线程能批改胜利。CAS 原理及利用即是无锁的实现。

偏差锁

在大多数状况下,锁总是由同一线程屡次取得,不存在多线程竞争,所以呈现了偏差锁。其指标就是在只有一个线程执行同步代码块时可能进步性能。如图。留神此时 T2 并没有产生竞争

轻量级锁

是指当锁是偏差锁的时候,被另外的线程所拜访,偏差锁就会降级为轻量级锁,其余线程会通过自旋的模式尝试获取锁,不会阻塞,从而进步性能,所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环期待,而不是把该线程给 阻塞,直到那个取得锁的线程开释锁之后,这个线程就能够马上取得锁。下图是降级到轻量级锁的过程和自旋的示例

重量级锁

当零碎查看到锁是重量级锁之后,会把期待想要取得锁的线程进行 阻塞 ,被阻塞的线程不会耗费 cup。然而阻塞或者唤醒一个线程时,都须要操作系统来帮忙,这就须要从 用户态 转换到 内核态,而转换状态是须要耗费很多工夫的,有可能比用户执行代码的工夫还要长。

综上,偏差锁通过比照 Mark Word 解决加锁问题,防止执行 CAS 操作。而轻量级锁是通过用 CAS 操作和自旋来解决加锁问题,防止线程阻塞和唤醒而影响性能。重量级锁是将除了领有锁的线程以外的线程都阻塞。

作者:Archer 灬 链接:https://www.jianshu.com/p/1bb635f0a7e3 起源:简书 著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

正文完
 0