冬瓜汤,奔驰跑车-188金博宝网站_金博宝188滚球_188足球比分直播

轻松搞懂Java中的自旋锁

前语

在之前的文章《一文完全搞懂面试中常问的各种“锁”》冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播中介绍了Java中的各种“锁”,或许关于不是很了解冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播这些概念的同学来说会觉得有点绕,所以我决议拆分相辅相成出来,逐渐具体的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会“自旋锁”。

正文

呈现原因

在咱们的程序中,假如存在着很多的互斥同步代码,当呈现高并发的时分,体系内核态就需求不断的去挂起线程和康复线程,频频的此类操作会对jingdong咱们体系的并发功能有必定影响。一起聪明的JVM开发团队也发现,在程序的履行过程中确认“共享资源“的时刻片是极短的,假如只是是为了这点时刻而去不断挂起、康复线程的话,耗费的时刻或许会更长,那就“捡了芝麻丢了西瓜”了。

而在一个多核的机器中,多个线程是能够并行履行的。假如当古典舞后边恳求锁的线程没拿到锁的时分,不挂起线程,而是持续占用处理器的履行时刻,让当时线程履行一个忙循环(自旋操作),也便是不断在盯着持有锁的线程是否现已开释锁,那么这便是传说中的自旋锁了。

自旋锁敞开

虽然在JDK1.鼬4.2的时分就引入了自旋锁,可是需求运用“-XX:+UseSpinning”参数来敞开。在到了JDK1.6今后,就现已是默许敞开了。下面咱们自己来完结一个依据CAS的简易版自旋锁。

publi野熊模仿3dc class Simple羊癫疯SpinningLock {
/**
* 持有锁的线程,null表明锁未被线程持有
*/
private AtomicReference ref = new AtomicReference<>();
public void lock(){
Thread currentThread = Thread.curre儿童手艺大全ntThread();
while(!ref.compareAndSet(null, currentThread)){
//当ref为null的时分compareAn我国人体dSet九阳回来true,反之为false
//经过循环不断的自旋判别锁是否被其他线程持有
}
}
乐华public void unLock() {
Thread cur = Thread.currentThread();
if(ref.get() 车载cd!= cur){
//exception ...
}
ref.set(null);
}
}

简简单单几行代码就完结了一个粗陋的自旋锁,下面咱们来测验一下

public class TestLock {
static int count = 冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播0;
public static void许嘉丽 main(String[] args) throws InterruptedException {
ExecutorService冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播 executo邹智文rService = Executors.newFixedThreadPool(10冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播0);
CountDownLatch countDownLatch = new CountDownLatch(100);
SimpleSpinningLock simpleSpinni冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播ngLock = new SimpleSpinningLock();
for (int i = 0 ; i < 100 ; i++){
executorService.execute(n戒欲ew Runnable() {
@Override
public void run() {
simpleSpinningLock.lock(打耳洞);
++count;
simpleSpinningLock.unLock();
countDownLatch.countDown();
}
});
}我与汉卿的终身
countDownLatch.await();
System.out.println(count);
}
}
// 屡次履行输出均为:100 ,完结了锁的基本功能

经过上面的代码能够看出,自旋便是在循环判别条件是否满意,那么会有什么问题吗?假如锁被占用很长时刻的话,自旋的线程等候的时刻也会变长,白白浪费掉处理traffick器资源。因而在JDK中,自旋操作默许10次,咱们能够经过参数“-XX:PreBlockSpin”来设置,当超越来此参数的值,则会运用传统的线程挂起方法来等候锁开释。咏雪

自适应冬瓜汤,奔跑跑车-188金博宝网站_金博宝188滚球_188足球比分直播自旋锁

跟着JDK的更新,在1.6的时分,又呈现了一个叫做“自适应自旋锁”的玩意。它的呈现使得自旋操作变得聪明起来,不再跟之前相同呆板。所谓的“自适应”意味着关于同一个锁目标,线程的自旋时刻是依据上一个持有该锁的线程的自旋时刻以及状况来确认的。例如关于A锁目标来说,假如一个线程刚刚经过自旋取得到了锁,而且该线程也在运转中,那么JVM会以为此次自旋操作也是有很大的时机能够拿到锁,因而它会让自旋的时谍战电视剧大全间相对延伸。可是假如关于B锁目标自旋操作很少成功的话,JVM乃至或许直接疏忽自旋操作。因而,自适应自旋锁是一个愈加智能,对咱们的事务功能愈加友爱的一个锁。

结语

原本想着在一篇文章里边把“自旋锁”,“锁消除”,“锁粗化”等一些锁优化的概念都介绍完结的,可是发现或许篇幅会比较大,关于没怎么触摸过这一块的同学来说了解起来会比较费劲,所以决议分隔多个章节介绍,期望我们都不明白的当地能够多看几遍,渐渐领会,相信你会有所收成的。

转载原创文章请注明,转载自188金博宝网站_金博宝188滚球_188足球比分直播,原文地址:http://www.dannyscontest.com/articles/529.html

上一篇:川贝,面首-188金博宝网站_金博宝188滚球_188足球比分直播

下一篇:刘邦,湛江旅游-188金博宝网站_金博宝188滚球_188足球比分直播