成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Java 基于AQS實現自定義同步器的示例

瀏覽:3日期:2022-08-16 08:53:03
一、AQS-條件變量的支持

在如下代碼中,當另外一個線程調用條件變量的signal方法的時候(必須先調用鎖的lock方法獲取鎖),在內部會把條件隊列里面隊頭的一個線程節點從條件隊列里面移除并且放入AQS的阻塞隊列里面,然后激活這個線程。

public final void signal() { if(!isHeldExclusively()) { throw IllegalMonitorException(); } Node first = firstWaiter; if(first != null){ // 將條件隊列頭元素移動到AQS隊列 doSignal(first); }} 需要注意的是,AQS提供了ConditionObject的實現,并沒有提供newCondition函數,該函數用來new一個ConditionObject對象,需要由AQS的子類來提供newConditon函數 下面來看當一個線程調用條件變量的await()方法而被阻塞后,如何將其放入條件隊列

private Node addConditionWaiter() { Node t = lastWaiter; ... // (1) Node node = new Node(Thread.currentThread(),Node.CONDITION); // (2) if(t == null){ firstWaiter = node; }else { t.nextWaiter = node; // (3) } lastWaiter = node; // (4) return node;} 代碼(1)首先根據根據當前線程創建了一個類型為Node.CONDITION的節點,然后通過代碼(2),(3),(4)在單向隊列尾部插入一個元素 注意:當多個線程同時調用lock.lock()方法獲取鎖時,只有一個線程獲取到了鎖,其他線程會被轉換為Node節點插入到lock鎖對應的AQS阻塞里面,并且做自旋CAS嘗試獲取鎖 如果獲取到了鎖的線程又調用對應條件變量的await()方法,則該線程會釋放獲取到的鎖,并被轉化為Node節點插入到條件變量對應的條件隊列里面 這時候因為調用lock.lock()方法被阻塞到AQS隊列里面的一個線程會獲取到被釋放的鎖,如果該線程也調用了條件變量的await()方法則該線程也會被放入條件變量的條件隊列里面 當另外一個線程調用條件變量的signal()或者signalAll()方法的時候,會把條件隊列里面的一個或者全部Node節點移動到AQS的阻塞隊列里面,等待時機獲取鎖。 最后使用一個圖總結:一個鎖對應一個AQS阻塞隊列,對應多個條件變量,每個條件變量有自己的一個條件隊列。

Java 基于AQS實現自定義同步器的示例

二、基于AQS實現自定義同步器 基于AQS實現一個不可重入的鎖,自定義AQS需要重寫一系列的函數,還需要定義原子變量state的含義,在這里我們定義state為0表示目前鎖沒有被線程持有,state為1表示所已經被某一個線程持有,由于是不可重入鎖,所以不需要記錄持有鎖的線程獲取鎖的次數,另外,我們自定義的鎖支持條件變量。 下面來看一下代碼實現

package com.ruigege.LockSourceAnalysis6;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;public class NonReentrantLockME implements Lock,java.io.Serializable{ // 內部幫助類 private static class Sync extends AbstractQueueSynchronizer { // 是否鎖已經被持有 protected boolean isHeldExclusively() { return getState() == 1; } // 如果state為0,則嘗試獲取鎖 public boolean tryAcquire(int acquires) { assert acquires == 1; if(compareAndSetState(0,1)) { setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } // 嘗試釋放鎖,設置state為0 protected boolean tryRelease(int release) { assert releases == 1; if(getState() == 0) { throw new IllegalMonitorStateException(); } setExclusiveOwnerThread(null); setState(0); return true; } // 提供條件變量接口 Condition newConditon() { return new ConditionObject(); } } // 創建一個Sync來做具體的工作 private final Sync sync = new Sync(); public void lock() { sync.acquire(1); } public boolean tryLock() { return sync.tryAcquire(1); } public void unlock() { sync.release(1); } public Condition newCondition() { return sync.newConditon(); } public boolean isLocked() { return sync.isHeldExclusively(); } public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } public boolean tryLock(long timeout,TimeUnit unit) throws InterruptedException { return sync.tryAcquireNanos(1,unit.toNanos(timeout)); }}

如上面的代碼,NonReentrantLock定義了一個內部類Sync用來實現具體的鎖的操作,Sync則繼承了AQS ,由于我們實現的獨占模式的鎖,所以Sync重寫了tryAcquiretryRelease和isHeldExclusively3個方法,另外Sync提供了newCondition這個方法用來支持條件變量。

三、源碼:

所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5

https://github.com/ruigege66/ConcurrentJava

以上就是Java 基于AQS實現自定義同步器的示例的詳細內容,更多關于Java 基于AQS實現自定義同步器的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
水野朝阳av一区二区三区| 99久久精品免费| 成人在线综合网站| 91成人网在线| 天天爽夜夜爽夜夜爽精品视频| 亚洲精选一区| 国产精品二三区| 91热门视频在线观看| 欧美va在线播放| 成人国产精品免费网站| 精品理论电影在线观看| 成人午夜视频在线| 91精品一区二区三区久久久久久 | 久久精品久久精品| 91成人在线精品| 另类小说色综合网站| 欧美日韩精品免费| 看电视剧不卡顿的网站| 欧美亚洲视频| 亚洲最新视频在线播放| 亚洲看片一区| 亚洲黄色小说网站| 欧美一级视频| 婷婷久久综合九色国产成人| 久久狠狠婷婷| 亚洲曰韩产成在线| 欧美在线综合| 日本va欧美va精品发布| 欧美视频一区在线| 国模娜娜一区二区三区| 在线成人免费观看| 国产一二三精品| 精品国产一区二区三区忘忧草| caoporn国产精品| 久久久精品天堂| 亚洲欧美亚洲| 欧美国产精品专区| 在线精品一区| 亚洲在线免费播放| 色视频欧美一区二区三区| 久久精品久久精品| 日韩免费福利电影在线观看| jizzjizzjizz欧美| 亚洲欧美在线观看| 嫩草成人www欧美| 免费人成精品欧美精品| 欧美日韩精品免费| 成人丝袜18视频在线观看| 久久亚洲综合色一区二区三区 | 成人精品国产免费网站| 欧美国产精品中文字幕| 亚洲精品一区二区三区樱花| 亚洲第一福利视频在线| 欧美三级韩国三级日本一级| 国产高清精品网站| 久久精品一区八戒影视| 亚洲第一在线| 视频一区国产视频| 在线播放亚洲一区| 91免费在线视频观看| 中文字幕日韩av资源站| 亚洲精品看片| 亚洲电影中文字幕在线观看| 欧美丝袜自拍制服另类| 99re免费视频精品全部| 亚洲激情六月丁香| 欧美日韩激情在线| 91看片淫黄大片一级在线观看| 亚洲精品乱码久久久久| 欧美日韩免费一区二区三区视频| 不卡高清视频专区| 亚洲精品欧美二区三区中文字幕| 色噜噜夜夜夜综合网| 国产黄人亚洲片| 国产精品理伦片| 色综合久久88色综合天天 | 国产精品一区二区91| 日本一区二区三区视频视频| 欧美亚洲免费在线| 国产河南妇女毛片精品久久久| 国产精品女人毛片| 在线亚洲一区观看| 色综合视频在线观看| 香港成人在线视频| 精品国产区一区| 麻豆av一区二区三区| 丁香激情综合国产| 亚洲曰韩产成在线| 日韩欧美一二三四区| 伊大人香蕉综合8在线视| 麻豆国产欧美一区二区三区| 久久久精品一品道一区| 亚洲欧美国产不卡| 国产福利精品一区| 亚洲人成在线观看一区二区| 欧美丰满嫩嫩电影| 一级成人国产| av在线不卡网| 亚洲综合免费观看高清完整版 | 一区二区成人在线观看| 日韩午夜激情视频| 一区二区三区成人精品| 成人中文字幕合集| 午夜精品久久久久久久99水蜜桃| 久久免费电影网| 欧美主播一区二区三区| 欧美视频1区| 精品无人码麻豆乱码1区2区 | 日韩一区二区免费电影| 欧美日韩国产小视频| 悠悠资源网久久精品| 国产成人啪免费观看软件| 亚洲一二三区视频在线观看| 日韩精品专区在线影院观看| 99亚洲精品| 成人性生交大片免费看在线播放 | 亚洲123区在线观看| 国产欧美精品区一区二区三区 | 亚洲国产日韩综合久久精品| 欧美精品一区视频| 色美美综合视频| 亚洲天堂成人| 成人午夜电影久久影院| 日韩国产欧美三级| 中文字幕一区二| 欧美成人猛片aaaaaaa| 色综合久久久久网| 伊人激情综合| 色综合久久综合| 国产激情一区二区三区桃花岛亚洲| 天天av天天翘天天综合网| 综合激情网...| 久久久久久久久久久黄色| 91麻豆精品国产91久久久久久久久 | 99国产精品久久久久久久久久| 免费视频一区二区| 亚洲综合免费观看高清在线观看| 国产拍揄自揄精品视频麻豆| 日韩精品一区二区三区在线播放 | 美日韩一区二区| 亚洲国产色一区| 亚洲欧美另类久久久精品| 欧美精品一区二区三区四区| 精品视频一区二区不卡| 麻豆成人在线播放| 亚洲国产黄色| 欧美日本免费| 99久久精品免费精品国产| 国产成人精品三级麻豆| 国产一区二区三区精品视频| 男女男精品视频| 日韩精品电影在线| 五月婷婷欧美视频| 亚洲国产人成综合网站| 一区二区三区在线观看欧美| 亚洲色欲色欲www在线观看| 久久嫩草精品久久久精品一| 日韩一级精品视频在线观看| 日韩限制级电影在线观看| 精品视频一区二区不卡| 在线国产亚洲欧美| 久久综合狠狠综合久久综青草| 国产精品毛片| 日韩天堂av| 在线观看亚洲视频啊啊啊啊| 黄色在线一区| 欧美日韩综合精品| 亚洲欧美综合一区| 欧美一区激情| 色综合一区二区| 91香蕉国产在线观看软件| av网站一区二区三区| av在线这里只有精品| 99精品久久只有精品| www.亚洲人| 99在线视频精品| 91片在线免费观看| 欧美另类专区| 亚洲国产精品毛片| 一区三区视频| 日韩一区二区久久| 国产精品亚洲综合| 亚洲欧美日韩国产一区二区| 久久久精品国产一区二区三区| 亚洲欧美日韩精品久久久| 久久久精品五月天| 欧洲在线/亚洲| 欧美精品 日韩| 欧美成人精品3d动漫h| 久久久精品人体av艺术| 欧美国产一区在线| 国产午夜精品在线观看| 国产区在线观看成人精品| 欧美激情中文不卡| 亚洲欧洲国产日本综合| 亚洲黄色录像片| 日韩国产欧美在线观看| 国产一区在线看| 99久久精品国产毛片| 国产一区观看|