亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

實(shí)例講解Java 自旋鎖

瀏覽:15日期:2022-08-25 08:00:36

一直以來(lái)不是怎么清楚自旋鎖,最近有點(diǎn)時(shí)間,好好的學(xué)習(xí)了一下;

所謂的自旋鎖在我的理解就是多個(gè)線程在嘗試獲取鎖的時(shí)候,其中一個(gè)線程獲取鎖之后,其他的線程都處在一直嘗試獲取鎖的狀態(tài),不會(huì)阻塞!!!那么什么叫做一直嘗試獲取鎖呢?就是一個(gè)循環(huán),比較經(jīng)典的是AtomicInteger中的一個(gè)updateAndGet方法,下圖所示(當(dāng)然也可以直接看unsafe類中的getAndAddInt等類似方法);

我們可以看出在while循環(huán)中使用CAS去嘗試更新一個(gè)變量,如果更新失敗,就會(huì)一直在這個(gè)循環(huán)中一直在嘗試;成功的話,就可以到最后的return語(yǔ)句;

由此我們可以大概知道如果自旋的線程過(guò)多,那么CPU的資源就會(huì)被大量消耗!!!

實(shí)例講解Java 自旋鎖

順便提一個(gè)東西叫做原子引用,官方提供了AtomicInteger,AtomicBoolean等原子類,那么如果我們自己定義的類也需要有原子性怎么辦呢?所以官方提供了一個(gè)AtomicReference類,可以將我們自己定義的類封裝一下,就成了我們自己的原子類,例如AtomicReference<Student> atomicReference = new AtomicReference<>();,然后我們對(duì)Student的實(shí)例進(jìn)行CAS各種CAS操作;

栗子:

package TestMain;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;@Slf4jpublic class TestMain80 { //一個(gè)Thread類的原子引用 AtomicReference<Thread> atomicReference = new AtomicReference<>(); //加鎖的方法 public void myLock() { Thread currentThread = Thread.currentThread(); log.info('myLock--Thread:{}', currentThread.getName()); //這個(gè)就是自旋鎖的核心,利用CAS比較當(dāng)前原子引用中是否為null,如果是null,就把當(dāng)前線程A放到里面去, // 此時(shí)線程B再到這里,那么就會(huì)CAS失敗,一直在while循環(huán)中 while (!atomicReference.compareAndSet(null, currentThread)) { } } //解鎖的方法 public void myUnlock() { Thread currentThread = Thread.currentThread(); //CAS比較原子引用中是不是線程A,是的話就更新為null,此時(shí)在上面while中一直在自旋的線程B就可以跳出來(lái)了 atomicReference.compareAndSet(currentThread, null); log.info('myUnlock--Thread:{}', currentThread.getName()); } public static void main(String[] args) { TestMain80 testMain80 = new TestMain80(); //線程A,首先加鎖,然后等3秒中,然后釋放鎖 new Thread(() -> { testMain80.myLock(); try {TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) {e.printStackTrace(); } testMain80.myUnlock(); }, 'A').start(); //主線程等1秒,保證A線程先執(zhí)行 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //線程B,加鎖再釋放鎖 new Thread(() -> { testMain80.myLock(); testMain80.myUnlock(); }, 'B').start(); }}

實(shí)例講解Java 自旋鎖

上面的就是一個(gè)自旋鎖的栗子,執(zhí)行結(jié)果中首先是執(zhí)行A線程的myLock方法,獲取鎖成功,之后的B線程雖然也會(huì)執(zhí)行mylock方法,但是會(huì)在while循環(huán)中一直阻塞,直到線程A調(diào)用了myUnlock方法釋放鎖,最后兩行才會(huì)打印出來(lái);

以上就是實(shí)例講解Java 自旋鎖的詳細(xì)內(nèi)容,更多關(guān)于Java 自旋鎖的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产视频三级 | 国产欧美精品综合一区 | 精品欧美成人bd高清在线观看 | 久久精品国产欧美 | 国内精品视频在线播放 | 国产91久久精品一区二区 | 亚洲欧美一区二区久久 | 高清精品 | 欧美3p在线观看一区二区三区 | 99视频在线观看视频一区 | 日韩第一页在线观看 | 国产丶欧美丶日韩丶不卡影视 | 亚洲精品成人久久 | 欧美+日本+国产+在线观看 | 欧美精品v日韩精品v国产精品 | 日本免费黄色片 | 黄色网址视频在线播放 | 亚洲精品中文字幕无乱码 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲欧美日韩一级特黄在线 | 欧美人伦禁忌dvd | 久久精品综合一区二区三区 | 极品嫩模被黑人20厘米 | 久久毛片免费看 | 噜噜噜福利视频在线观看 | 日韩三级黄色 | 亚洲综合色婷婷六月丁香 | 久久精品99 | 精品一区二区91 | 视频办公室添的我好爽 | 国产人免费人成免费视频 | 国产成人一区二区在线不卡 | 在线播放成人毛片免费视 | 亚洲午夜久久久久久91 | 香蕉手机网 | 国产精品素人搭讪在线播放 | 最近更新中文字幕3 | 天天影视色 | 国产日韩欧美中文字幕 | 131美女爽爽爽爱做视频 | 微拍秒拍99福利精品小视频 |