日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

詳解Java并發之Condition

瀏覽:190日期:2022-08-31 15:35:28

在使用Lock之前,我們使用的最多的同步方式應該是synchronized關鍵字來實現同步方式了。配合Object的wait()、notify()系列方法可以實現等待/通知模式。Condition接口也提供了類似Object的監視器方法,與Lock配合可以實現等待/通知模式,但是這兩者在使用方式以及功能特性上還是有差別的。Object和Condition接口的一些對比。摘自《Java并發編程的藝術》

詳解Java并發之Condition

一、Condition接口介紹和示例

首先我們需要明白condition對象是依賴于lock對象的,意思就是說condition對象需要通過lock對象進行創建出來(調用Lock對象的newCondition()方法)。consition的使用方式非常的簡單。但是需要注意在調用方法前獲取鎖。

package com.ydl.test.juc;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ConditionUseCase { public Lock lock = new ReentrantLock(); public Condition condition = lock.newCondition(); public static void main(String[] args) { ConditionUseCase useCase = new ConditionUseCase(); ExecutorService executorService = Executors.newFixedThreadPool (2); executorService.execute(new Runnable() { @Override public void run() {useCase.conditionWait(); } }); executorService.execute(new Runnable() { @Override public void run() {useCase.conditionSignal(); } }); } public void conditionWait() { lock.lock(); try { System.out.println(Thread.currentThread().getName() + '拿到鎖了'); System.out.println(Thread.currentThread().getName() + '等待信號'); condition.await(); System.out.println(Thread.currentThread().getName() + '拿到信號'); }catch (Exception e){ }finally { lock.unlock(); } } public void conditionSignal() { lock.lock(); try { Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + '拿到鎖了'); condition.signal(); System.out.println(Thread.currentThread().getName() + '發出信號'); }catch (Exception e){ }finally { lock.unlock(); } }}

pool-1-thread-1拿到鎖了pool-1-thread-1等待信號pool-1-thread-2拿到鎖了pool-1-thread-2發出信號pool-1-thread-1拿到信號

如示例所示,一般都會將Condition對象作為成員變量。當調用await()方法后,當前線程會釋放鎖并在此等待,而其他線程調用Condition對象的signal()方法,通知當前線程后,當前線程才從await()方法返回,并且在返回前已經獲取了鎖。

二、Condition接口常用方法

condition可以通俗的理解為條件隊列。當一個線程在調用了await方法以后,直到線程等待的某個條件為真的時候才會被喚醒。這種方式為線程提供了更加簡單的等待/通知模式。Condition必須要配合鎖一起使用,因為對共享狀態變量的訪問發生在多線程環境下。一個Condition的實例必須與一個Lock綁定,因此Condition一般都是作為Lock的內部實現。

await() :造成當前線程在接到信號或被中斷之前一直處于等待狀態。

await(long time, TimeUnit unit) :造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態。

awaitNanos(long nanosTimeout) :造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態。返回值表示剩余時間,如果在nanosTimesout之前喚醒,那么返回值 = nanosTimeout - 消耗時間,如果返回值 <= 0 ,則可以認定它已經超時了。

awaitUninterruptibly() :造成當前線程在接到信號之前一直處于等待狀態。【注意:該方法對中斷不敏感】。

awaitUntil(Date deadline) :造成當前線程在接到信號、被中斷或到達指定最后期限之前一直處于等待狀態。如果沒有到指定時間就被通知,則返回true,否則表示到了指定時間,返回返回false。

signal() :喚醒一個等待線程。該線程從等待方法返回前必須獲得與Condition相關的鎖。

signal()All :喚醒所有等待線程。能夠從等待方法返回的線程必須獲得與Condition相關的鎖。

三、Condition接口原理簡單解析

Condition是AQS的內部類。每個Condition對象都包含一個隊列(等待隊列)。等待隊列是一個FIFO的隊列,在隊列中的每個節點都包含了一個線程引用,該線程就是在Condition對象上等待的線程,如果一個線程調用了Condition.await()方法,那么該線程將會釋放鎖、構造成節點加入等待隊列并進入等待狀態。等待隊列的基本結構如下所示。

詳解Java并發之Condition

等待分為首節點和尾節點。當一個線程調用Condition.await()方法,將會以當前線程構造節點,并將節點從尾部加入等待隊列。新增節點就是將尾部節點指向新增的節點。節點引用更新本來就是在獲取鎖以后的操作,所以不需要CAS保證。同時也是線程安全的操作。

3.2、等待

當線程調用了await方法以后。線程就作為隊列中的一個節點被加入到等待隊列中去了。同時會釋放鎖的擁有。當從await方法返回的時候。一定會獲取condition相關聯的鎖。當等待隊列中的節點被喚醒的時候,則喚醒節點的線程開始嘗試獲取同步狀態。如果不是通過 其他線程調用Condition.signal()方法喚醒,而是對等待線程進行中斷,則會拋出InterruptedException異常信息。

3.3、通知

調用Condition的signal()方法,將會喚醒在等待隊列中等待最長時間的節點(條件隊列里的首節點),在喚醒節點前,會將節點移到同步隊列中。當前線程加入到等待隊列中如圖所示:

詳解Java并發之Condition

在調用signal()方法之前必須先判斷是否獲取到了鎖。接著獲取等待隊列的首節點,將其移動到同步隊列并且利用LockSupport喚醒節點中的線程。節點從等待隊列移動到同步隊列如下圖所示:

詳解Java并發之Condition

被喚醒的線程將從await方法中的while循環中退出。隨后加入到同步狀態的競爭當中去。成功獲取到競爭的線程則會返回到await方法之前的狀態。

四、總結

調用await方法后,將當前線程加入Condition等待隊列中。當前線程釋放鎖。否則別的線程就無法拿到鎖而發生死鎖。自旋(while)掛起,不斷檢測節點是否在同步隊列中了,如果是則嘗試獲取鎖,否則掛起。當線程被signal方法喚醒,被喚醒的線程將從await()方法中的while循環中退出來,然后調用acquireQueued()方法競爭同步狀態。

五、利用Condition實現生產者消費者模式

import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class BoundedQueue { private LinkedList<Object> buffer; //生產者容器 private int maxSize ; //容器最大值是多少 private Lock lock; private Condition fullCondition; private Condition notFullCondition; BoundedQueue(int maxSize){ this.maxSize = maxSize; buffer = new LinkedList<Object>(); lock = new ReentrantLock(); fullCondition = lock.newCondition(); notFullCondition = lock.newCondition(); } /** * 生產者 * @param obj * @throws InterruptedException */ public void put(Object obj) throws InterruptedException { lock.lock(); //獲取鎖 try { while (maxSize == buffer.size()){notFullCondition.await(); //滿了,添加的線程進入等待狀態 } buffer.add(obj); fullCondition.signal(); //通知 } finally { lock.unlock(); } } /** * 消費者 * @return * @throws InterruptedException */ public Object get() throws InterruptedException { Object obj; lock.lock(); try { while (buffer.size() == 0){ //隊列中沒有數據了 線程進入等待狀態fullCondition.await(); } obj = buffer.poll(); notFullCondition.signal(); //通知 } finally { lock.unlock(); } return obj; }}

以上就是詳解Java并發之Condition的詳細內容,更多關于Java并發Condition的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久免费视频| 久久精品三级| 成人在线观看免费视频| 模特精品在线| 久久一区二区中文字幕| 国产一区精品福利| 国产精品男女| 日韩高清在线一区| 亚洲制服欧美另类| 99视频精品| 亚洲第一区色| av中文字幕在线观看第一页 | 国产美女高潮在线| 91亚洲国产| 日韩精品一区二区三区免费观看| 亚洲风情在线资源| 亚洲高清久久| 视频在线观看国产精品| 亚洲精品护士| 国产精品对白| 日韩一区二区中文| 一区视频在线| 日韩1区2区3区| 国产精品欧美在线观看| 国产精久久久| 电影天堂国产精品| 热久久国产精品| 国产精品亚洲欧美| 久久久五月天| 亚欧成人精品| 精品国产乱码久久久| 久久精品二区三区| 玖玖玖国产精品| 热久久久久久| 国产精品久久久久久久久久10秀 | 天堂日韩电影| 视频一区二区三区入口| 日韩精品导航| 国产96在线亚洲| 亚洲成人三区| 国产欧美日韩一级| 久久精品播放| 日韩av不卡在线观看| 中文字幕一区久| 亚洲另类av| 成人免费一区| 日韩在线一区二区| 国产一区二区三区视频在线| 日韩亚洲国产欧美| 精品一区91| 蜜臀av在线播放一区二区三区| 久久不见久久见免费视频7| 欧产日产国产精品视频| 亚洲久久在线| 成人精品天堂一区二区三区| 日韩二区三区四区| 久久久夜精品| 国产日本亚洲| 欧美精品黄色| 欧美激情91| 亚洲一区不卡| 色爱综合网欧美| 日韩国产一区二| 欧美成人精品三级网站| 日韩精品国产精品| 国产99久久| 精品一区二区三区中文字幕视频 | av在线最新| 青青国产91久久久久久| 国精品一区二区三区| 国产精品天堂蜜av在线播放| 国产精品嫩草99av在线| 91视频久久| 69堂精品视频在线播放| 99国内精品| 午夜av不卡| 日本欧美大码aⅴ在线播放| 亚洲欧美综合| 91欧美国产| 国产图片一区| 亚洲97av| 国产美女一区| 久久国产中文字幕| 国产suv精品一区二区四区视频| 日韩在线黄色| 影院欧美亚洲| 人人精品亚洲| 成人亚洲精品| 国产麻豆一区| 日本不卡的三区四区五区| 黄色成人精品网站| 88xx成人免费观看视频库| 久久av日韩| 欧美一级一区| 日韩中文字幕不卡| 免费黄色成人| 91免费精品| 久久这里只有| 欧美日韩亚洲一区| 一区二区电影| 亚洲一区二区三区高清| 欧美日韩精品免费观看视欧美高清免费大片 | 欧美肉体xxxx裸体137大胆| 欧美精品99| 亚洲久草在线| 亚洲一区二区毛片| 欧美日韩四区| 1024精品久久久久久久久| av一区在线| 蜜臀国产一区| 精精国产xxxx视频在线野外| 日韩欧美精品综合| 日韩在线不卡| 亚洲伦乱视频| 天堂资源在线亚洲| 欧美搞黄网站| 一区二区视频欧美| 欧美在线亚洲| 亚洲免费播放| 亚洲免费黄色| 99国产精品| 视频一区在线播放| 热久久免费视频| 在线精品观看| 婷婷精品在线观看| 欧美在线观看天堂一区二区三区| 91麻豆精品| 国产精品99精品一区二区三区∴| 国产免费播放一区二区| 美女尤物国产一区| 精品久久91| 精品日韩视频| 午夜精品网站| 免费在线观看日韩欧美| 亚洲狼人精品一区二区三区| 综合视频一区| 日韩av中文字幕一区二区| 欧美色综合网| 国产一区二区三区国产精品| 欧美精品日日操| 午夜影院欧美| 亚洲欧美在线综合| 国产精品调教| 日韩一区二区在线免费| 99久久亚洲精品| 伊人久久亚洲热| 午夜精品影视国产一区在线麻豆| 91精品国产自产观看在线| 卡一卡二国产精品| 97人人精品| 免费视频亚洲| 日韩黄色av| 国产成人黄色| 伊人久久亚洲热| 青青草国产精品亚洲专区无| 粉嫩av一区二区三区四区五区| 午夜欧美巨大性欧美巨大| 91久久中文| 日本精品另类| 鲁鲁在线中文| 久久性天堂网| 欧美成人精品午夜一区二区| 久久国产中文字幕| 日韩一区二区三区在线看| 欧美aa在线视频| 欧美成人基地| 日韩精品中文字幕一区二区| 国产成人久久| 亚洲综合日本| 久久一区精品| 欧美精品一卡| 国产激情精品一区二区三区| 亚洲成人国产| 91成人小视频| 播放一区二区| 日韩av资源网| 久久久久亚洲| 97久久亚洲| 久久麻豆精品| 国产日韩一区二区三区在线 | 欧美日中文字幕| 日韩高清电影免费| 色爱av综合网| 国产欧美一区二区三区米奇| 999精品色在线播放| 日韩av成人高清| 欧美日韩在线观看视频小说| 欧美日韩一区二区国产| 国产精品88久久久久久| 国产乱人伦精品一区| 91精品婷婷色在线观看| 国产毛片一区二区三区 | 欧美一区成人| 激情六月综合| 久久99精品久久久久久园产越南| 欧美精品一线| 国产成人黄色| 欧美日韩99| 久久高清免费观看| 波多野结衣久久精品|