JVM对synchronized的优化

本文详细解析了JVM在JDK1.6之后对synchronized锁的优化策略,包括锁的膨胀升级、粗化、消除,以及自旋锁的应用。同时对比了AbstractQueuedSynchronizer(AQS)与synchronized锁的不同,阐述了AQS如何实现类似互斥锁的功能。

在JDK1.6之后JVM对synchronized底层进行了优化,提高了并发访问性能得到提升:

第一点:锁的膨胀升级过程是最大的优化
第二点:锁的粗化
第三点:锁的消除

锁的膨胀升级过程:
无锁–》偏向锁–》轻量级锁–》重量级锁(互斥锁)

在这里插入图片描述
锁优化后一共有四种状态,无锁、偏向锁、轻量级锁、重量级锁。一开始从new出来的对象没有线程使用和加锁是无锁状态,然后随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重 量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级

偏向锁:
偏向锁是Java 6之后加入的新锁,它是一种针对加锁操作的优化手段,经过研究发现,在大多数情况下,锁不仅不存在多线程竞 争,而且总是由同一线程多次获得,因此为了减少同一线程获取锁(会涉及到一些CAS操作,耗时)的代价而引入偏向锁。偏向锁的核心 思想是,如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word 的结构也变为偏向锁结构,当这个线程再次请求锁时, 无需再做任何同步操作,即获取锁的过程,这样就省去了大量有关锁申请的操作,从而也就提供程序的性能。所以,对于没有锁竞争 的场合,偏向锁有很好的优化效果,毕竟极有可能连续多次是同一个线程申请相同的锁。但是对于锁竞争比较激烈的场合,偏向锁就 失效了,因为这样场合极有可能每次申请锁的线程都是不相同的,因此这种场合下不应该使用偏向锁,否则会得不偿失,需要注意的 是,偏向锁失败后,并不会立即膨胀为重量级锁,而是先升级为轻量级锁
偏向锁是针对在单个同一线程执行的情况下,对锁的一种优化,就是同一线程多次获取锁,不需要再次申请锁,提高性能。
轻量级锁:
倘若偏向锁失败,虚拟机并不会立即升级为重量级锁,它还会尝试使用一种称为轻量级锁的优化手段(1.6之后加入的),此时 Mark Word 的结构也变为轻量级锁的结构。轻量级锁能够提升程序性能的依据是“对绝大部分的锁,在整个同步周期内都不存在竞 争”,注意这是经验数据。需要了解的是,轻量级锁所适应的场景是线程交替执行同步块的场合,如果存在同一时间访问同一锁的场 合,就会导致轻量级锁膨胀为重量级锁

自旋锁
轻量级锁失败后,虚拟机为了避免线程真实地在操作系统层面挂起,还会进行一项称为自旋锁的优化手段。这是基于在大多数情 况下,线程持有锁的时间都不会太长,如果直接挂起操作系统层面的线程可能会得不偿失,毕竟操作系统实现线程之间的切换时需要 从用户态转换到核心态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,因此自旋锁会假设在不久将来,当前的线 程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环(这也是称为自旋的原因),一般不会太久,可能是50个循环或 100循环,在经过若干次循环后,如果得到锁,就顺利进入临界区。如果还不能获得锁,那就会将线程在操作系统层面挂起,这就是 自旋锁的优化方式,这种方式确实也是可以提升效率的。最后没办法也就只能升级为重量级锁了

锁的粗化:
JVM在开启逃逸分析之后,对代码上下文的分析,然后把一些不合理的代码进行优,比如在同一个方法里,多次调用同一个同步的方法,会在编译的时候进行优化,将多次加锁和释放,优化成一次加锁和释放。

锁的消除:

当加锁对象是在方法里的局部变量,属于线程栈独享的锁,不存在其他线程来竞争的情况,逃逸分析会对同步块的锁消除掉。

synchronied:
应用层面
是一种互斥锁,怎么应用,加在方法、方法体同步代码块、静态方法,不同的位置加锁的粒度不一样。
原理层面:
入锁,从字节码层面代码怎么做的,然后锁的优化(粗化、消除、逃逸分析),锁的膨胀升级过程
AbstractQueuedSynchronizer
实现类似synchronied互斥锁的功能,由java实现的工具包,在juc包下的lock包有dog li 写的aqs抽象队列同步器也能实现类似的功能,比如该框架的实现类reetrantlock,是一种互斥锁,实现了aqs的特性,例如非公平锁与公平锁 可重入。
与synchronied的区别,synchronied是由jvm自己实现加锁和释放的过程,是一种内置隐式锁。而我们的
AbstractQueuedSynchronizer实现的锁是一种显示锁,需要手动加锁和释放,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值