安博电竞入口_安博电竞app_电竞娱乐平台
安博电竞入口

一受封疆,京张高铁-安博电竞入口_安博电竞app_电竞娱乐平台

admin admin ⋅ 2019-05-21 08:18:26

轻松搞懂Java中的自旋锁

前语

在之前的文章《一文完全搞懂面试中常问的各种“锁”》中介绍了Ja再遇霍承安va中的各种“锁”,或许关于不是很了解这些概念性爱让我挂急诊的同学来说会觉得有点绕,所以我决议拆分出来,逐渐具体的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会“自旋锁”。

正文

呈现原因

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

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

自旋锁敞开

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

p优女ublic class SimpleSpinn安脉盛ingLock {
/**
* 持有锁的线程,null表明锁未被线程持有
*/
private AtomicReferehotmoviesnce ref = new AtomicReference<>();
public void lock(){
Thread 王国华追凶currentThread = Thread.一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道c师蚕urrentThread();
while(!ref.compareAndSet(null, currentT泰坦神铁矿石哪里多hread)){
//当ref为null的时分compareAndSet回来true,反之为false
//经过循环不断的自旋判别锁是否被其他线程持有
}
}
public void unLock() {
Thread cur = Thread.currentThread();
if(ref.get() != cur){
//exception ...
}一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道
ref.set(null)一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道;
}
}

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

public class TestLock {
static int count = 0;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newF清宫良妃传ixedThreadPool(100);
CountD科学上网什么意思ownLatch countDo妻威平舒道wnLatch = new CountDownLatch(100);
SimpleSpinningLock simpleSpinningLock = new SimpleSpinningLock();
for (int i = 0 ; i < 100 ; i++){
executorService.execute(n大冢千弘ew Runnable() {
@O一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道verride
public void run() {
simpleSpinningLock.lock();
++count;
simpleSpinningLock.un一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道Lock();
countDown一受封疆,京张高铁-安博电竞进口_安博电竞app_电竞文娱渠道Latch.countDown();
}
});
}
countDownLatch.await();
System.out.println(count);
}
}
// 屡次履行输出均为:100 ,实道德三级电影现了锁的基本功能

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

自适应自旋锁

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

结语

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

相关新闻

admin

admin

TA太懒了...暂时没有任何简介

精彩新闻