锁的膨胀升级-创新互联

目录

成都创新互联提供高防物理服务器租用、云服务器、香港服务器、西部信息机房

一、锁的状态

二、偏向锁

三、轻量级锁

四、自旋锁


一、锁的状态

锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级锁,但是锁的升级是单向的,只能从低级升级到高级,不会出现锁降级。从Jdk1.6中默认是开启偏向锁和轻量级锁的,可以通过-XX:-UseBiasedLocking来禁用偏向锁。

二、偏向锁

偏向锁是Java1.6之后加入的新锁,它是一种针对加锁操作的优化手段,经过研究发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,因此为了减少同一线程获取锁的代价而引入偏向锁。偏向锁的核心思想是,如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word的结构也变为偏向锁结构,当这个线程再次请求时,无需再做任何同步操作,即获取所得过程,这样就省去了大量有关锁申请的操作,从而也就提高了程序的性能。

①:对于没有锁竞争的场合,偏向锁有很好的优化效果,毕竟极有可能连续多次时同一个线程申请相同的锁;

②:对于锁竞争比较激烈的场合,偏向锁就失效了,因为这样场合下极有可能每次申请锁的线程都是不同的,因此这种场合下不应该使用偏向锁。

三、轻量级锁

如果偏向锁失败,虚拟机不会立即升级为重量级锁,它还会尝试使用一种称为轻量级锁的优化手段(1.6之后加入的),此时Mark Word的结构也变为轻量级锁的结构。轻量级锁能够提升程序性能的依据是,对绝大部分锁,在整个同步周期内都不存在竞争(这是经验数据)。轻量级锁所适应的场景是线程交替执行同步块的场合,如果存在同一时间访问同一锁的场合,就会导致轻量级锁膨胀为重量级锁。

四、自旋锁

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:锁的膨胀升级-创新互联
本文来源:http://myzitong.com/article/gescj.html