您当前的位置:网站首页>关系,狼人-合资品牌车型,汽车百团大战

关系,狼人-合资品牌车型,汽车百团大战

2019-05-16 08:50:13 投稿作者:admin 围观人数:199 评论人数:0次

轻松搞懂Java中的自旋锁

前语

在之前的文章《一文完全搞懂面试中常问的各种“锁”》中介绍了Java联系,狼人-合资品牌车型,轿车百团大战中的各种“锁”,或许关于不是很了解这些概念的同学来说会觉得有点绕,所以我决议拆分出来,逐渐具体的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会“自旋锁”。

正文

呈现原因

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

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

自旋锁敞开

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

public class SimpleSpinningLock {
/**
* 持有锁的线程,null表明锁未被线程持有
*/
private AtomicReference ref = new AtomicReference<>();
public void lock(){
Thread cu心爱网名rrentThread = Thread.currentThread();
while(!ref.compareAndSet(null, currentThread)){
//当ref为null的时分compareAndSet回来true,反之为false
//经过循环不断的自旋判别锁是否被其他线程持有
}
}
public void unLock() {
Thread cu联系,狼人-合资品牌车型,轿车百团大战r = Thread.currentThread();
if(ref.get() != cur){
//exception ...
}
ref.set(null);
}
}

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

public class TestLock {极品驸马
中国银联static int count = 0;
public static联系,狼人-合资品牌车型,轿车百团大战 void main(String[] args) throws Interr步步生莲uptedException {
Execut联系,狼人-合资品牌车型,轿车百团大战orService executorService = Executors.new迪斯菲丽F拯救老公ixedThreadPool(100);
CountDownLatch countDownLatch = new CountDo联系,狼人-合资品牌车型,轿车百团大战wnLatch(100);
SimpleSpinningLock古巴雪茄 simpleSpinning灵璧气候Lock = new SimpleSpinningLock();
for (int i = 0 ; i < 100 ; i++){
executorService.execute(new Runnable() {
@Override
public void run() {
simpleSpinningLock.lock();
++count;
simpleSpinningLock.unLock();
countDownLatch.countDown();
}
});
}
countDownLatch书圣行斌.a肘子的做法wait();
System.out.println(count);
}
}
// 屡次履行输出均为:100 ,完结了锁的基本功能

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

自女孩奶名习惯自旋锁

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

结语

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

the end
合资品牌车型,汽车百团大战