面试官:JVM对锁进行了优化,都优化了啥?

 品牌推广     |      2020-07-30 12:50

从JDK1.6开端,JVM对锁进行了各种优化,意图便是为了在线程间更高效的同享数据和处理互斥同步的问题。 从锁优化的论题开端,能够引申出许多考点面试题,比方锁优化的技能、各优化技能的细节、CAS完结原理、CAS的ABA问题及怎么处理等,持续发散还会引发更多问题,例如逃逸剖析等,能够看出技能点都是相关联的,需求不断堆集和整理。

面试官 : JVM完结了哪些锁优化技能?

小白 : 自旋锁、自适应自旋锁、锁粗化、锁消除、倾向锁、轻量级锁。

面试官 : 介绍一下自旋锁? 为什么引进自旋锁?

小白 : 自旋锁便是在恳求获取锁,又不能立刻获取届时,让当时线程在不抛弃处理器履行时刻的状况下履行忙循环,测验等候锁被开释,再获取锁。 引进自旋锁是为了节约线程挂起和康复的开支。

面试官 : 你刚刚说引进自旋锁节约了线程挂起和康复的开支,但循环也是需求占用处理器时刻的,那这个自旋的次数怎么操控?

小白 : 默许是10次,也能够经过JVM参数-XX:PreBlockSpin装备,当然这些自旋都是固定的,所以引进了自适应自旋锁,自旋的次数由前一次在同一个锁上的自旋次数和锁的具有者的状况来决议。 假如前面线程成功获取锁而且正常运转,那么本次获取锁的可能性很大,所以自旋的次数相对多一些; 假如前面线程很少成功获取锁,那么本次获取锁的概率也很小,就可能不履行自旋了。

面试官 : 锁粗化优化了什么?

小白 : 假如在一段代码中同一线程重复获取、开释同一个目标的锁,将会出产不必要的功能开支,所以需求把获锁的规模扩展,对同一个目标的锁操作只进行一次,在头部获取锁,在尾部开释锁。

面试官 : 锁消除是什么?

小白 : 锁消除是指JIT在运转时剖析到运用了锁的同步代码在实践运转时不可能存在同享数据被竞赛的状况,对锁进行去除。 例如假如一个局部变量在办法内部不可能被外部引证,那么它就不需求加锁操控,能够去掉锁。

面试官 : 详细说一下倾向锁?

小白 : 倾向锁便是假如线程持有了锁,在后续的进程中,只需该锁没有被其它线程持有,那么持有倾向锁的线程将不再需求进行同步操作。 这个倾向锁的相关信息是保存在Java目标的目标头中的。 在HotSpot虚拟机中,Java目标在内存中存储的布局分为3块区域:目标头、实例数据和对齐填充。目标头包括两部分,榜首部分包括目标的HashCode、分代年纪、锁标志位、线程持有的锁、倾向线程ID等数据,这部分数据的长度在32位和64位虚拟机平分别为32bit和64bit,官方称为Mark World,用一张图 展现不同状况下,目标头中存储的内容。

一个一般Java目标刚开端是处于无锁状况的, Mark World中存储的数据如上图中的榜首行所示。 当虚拟机启动了倾向锁,锁目标榜首次被线程获取的时分,锁标识方位为01,一起运用CAS将获取到这个锁的线程ID设置到Mark World中,假如CAS操作成功,那么这个线程将能够持续履行相关的同步代码。假如此刻有其它线程测验获取锁,有两种状况,一种是锁目标未被确定,则倾向锁被吊销,康复到无锁状况;另一种是目标被确定,那么倾向锁失效,一起晋级为轻量级锁,会在当时线程的栈帧中创立一个锁记载的空间,这个空间存储目标头中Mark World的仿制,便是仿制一份到这个锁记载空间,一起虚拟机运用CAS测验将这个锁记载空间的指针更新到Mark World,假如CAS操作成功,那么当时线程获取到锁,此刻锁状况处于轻量级锁,锁标志方位为00。

面试官 :你刚刚提到虚拟机运用CAS进行更新操作,Java中的CAS是什么及怎么完结的?

小白 :CAS是比较和替换,是一种经过硬件完结并发安全的常用技能,底层经过运用CPU的CAS指令对缓存加锁或总线加锁的方法来完结多处理器之间的原子操作。它的完结进程是,有3个操作数,内存值V,旧的预期值E,要修正的新值U,当且仅当预期值E和内存值V相一起,才将内存值V修正为U,不然什么都不做。CAS底层完结运用了C ,在其代码中会依据操作系统和处理器的不同来挑选对应的调用代码,以Windows和x86处理器为例,假如是多处理器,经过带lock前缀的cmpxchg指令对缓存加锁或总线加锁的方法来完结多处理器之间的原子操作;假如是单处理器,经过cmpxchg指令完结原子操作。

面试官 :那你知道CAS中的ABA问题吗?

小白 :知道,CAS是当且仅当旧的预期值E和内存值V相一起,才将内存值V修正为U,也便是假如内存值V没有发生改变则更新,可是有可能发生内存值原来是A,中心被改成B,后来又被改成A,此刻再运用CAS进行查看时发现没有改变,可是实践上发生了改变,这便是ABA问题。

面试官 :这个问题怎么处理?

小白 :Java并发包下的AtomicStampedReference能够处理ABA问题,内部完结上添加了一个类似于版本号效果的stamp特点,它是被自动更新的。完结上首要查看当时引证是否等于预期引证、当时stamp是否等于预期stamp,假如悉数持平,则以原子方法将该引证和该stamp的值设置为给定的更新值。

高并发编程-CAS深化解析

synchronized连环问

如有收成,请点击底部右下角 在看 ,谢谢!