成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術文章
文章詳情頁

實例講解Java 自旋鎖

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

一直以來不是怎么清楚自旋鎖,最近有點時間,好好的學習了一下;

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

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

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

實例講解Java 自旋鎖

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

栗子:

package TestMain;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;@Slf4jpublic class TestMain80 { //一個Thread類的原子引用 AtomicReference<Thread> atomicReference = new AtomicReference<>(); //加鎖的方法 public void myLock() { Thread currentThread = Thread.currentThread(); log.info('myLock--Thread:{}', currentThread.getName()); //這個就是自旋鎖的核心,利用CAS比較當前原子引用中是否為null,如果是null,就把當前線程A放到里面去, // 此時線程B再到這里,那么就會CAS失敗,一直在while循環(huán)中 while (!atomicReference.compareAndSet(null, currentThread)) { } } //解鎖的方法 public void myUnlock() { Thread currentThread = Thread.currentThread(); //CAS比較原子引用中是不是線程A,是的話就更新為null,此時在上面while中一直在自旋的線程B就可以跳出來了 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(); }}

實例講解Java 自旋鎖

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 国产高清精品毛片基地 | 日韩三级精品 | 亚洲爽爽| 看一级毛片一区二区三区免费 | 性欧美一级 | 在线一级片 | 欧美一及 | 亚洲男人在线天堂 | 日韩成人在线观看视频 | 亚洲美女影院 | 中文字幕一区二区小泽玛利亚 | 久久一本精品久久精品66 | 国产特黄一级毛片特黄 | 三级黄页 | 欧美一级毛片美99毛片 | 日本九六视频 | 欧美成人三级伦在线观看 | 特级aaa片毛片免费观看 | 亚洲一区二区在线视频 | 国产99久久 | 亚洲二区在线播放 | 美国毛片在线 | 嫩草影院在线观看网站成人 | 99精选视频| 天堂最新版 | 黄毛片一级毛片 | 中国老妇色xxxxx | 手机看片日韩日韩国产在线看 | 久久精品国内偷自一区 | 国产三级久久 | 久操视频免费在线观看 | 欧美日本视频一区 | 国自产精品手机在线视频香蕉 | 一国产一级淫片a免费播放口 | 久久中文字幕免费视频 | 一本色道久久综合狠狠躁 | 亚洲一区二区三区香蕉 | 国产日本三级 | 免费观看性欧美毛片 | 亚洲综合在线视频 | 欧美精品亚洲人成在线观看 |