日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

24、Java并发性和多线程-信号量

發布時間:2025/7/14 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 24、Java并发性和多线程-信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容轉自http://ifeve.com/semaphore/:

Semaphore(信號量) 是一個線程同步結構,用于在線程間傳遞信號,以避免出現信號丟失(譯者注:下文會具體介紹),或者像鎖一樣用于保護一個關鍵區域。自從5.0開始,jdk在java.util.concurrent包里提供了Semaphore的官方實現,因此大家不需要自己去實現Semaphore。但是還是很有必要去熟悉如何使用Semaphore及其背后的原理

本文的涉及的主題如下:

一、簡單的Semaphore實現

下面是一個信號量的簡單實現:

public class Semaphore {private boolean signal = false;public synchronized void take() {this.signal = true;this.notify();}public synchronized void release() throws InterruptedException{while(!this.signal) wait();this.signal = false;}}

take方法發出一個被存放在Semaphore內部的信號,而release方法則等待一個信號,當其接收到信號后,標記位signal被清空,然后該方法終止。

使用這個semaphore可以避免錯失某些信號通知。用take方法來代替notify,release方法來代替wait。如果某線程在調用release等待之前調用take方法,那么調用release方法的線程仍然知道take方法已經被某個線程調用過了,因為該Semaphore內部保存了take方法發出的信號。而wait和notify方法就沒有這樣的功能。

當用semaphore來產生信號時,take和release這兩個方法名看起來有點奇怪。這兩個名字來源于后面把semaphore當做鎖的例子,后面會詳細介紹這個例子,在該例子中,take和release這兩個名字會變得很合理。

二、使用Semaphore來產生信號

下面的例子中,兩個線程通過Semaphore發出的信號來通知對方

Semaphore semaphore = new Semaphore();SendingThread sender = new SendingThread(semaphore);ReceivingThread receiver = new ReceivingThread(semaphore);receiver.start(); sender.start(); public class SendingThread {Semaphore semaphore = null;public SendingThread(Semaphore semaphore){this.semaphore = semaphore;}public void run(){while(true){//do something, then signalthis.semaphore.take();}} } public class RecevingThread {Semaphore semaphore = null;public ReceivingThread(Semaphore semaphore){this.semaphore = semaphore;}public void run(){while(true){this.semaphore.release();//receive signal, then do something... }} }

三、可計數的Semaphore

上面提到的Semaphore的簡單實現并沒有計算通過調用take方法所產生信號的數量。可以把它改造成具有計數功能的Semaphore。下面是一個可計數的Semaphore的簡單實現。

public class CountingSemaphore {private int signals = 0;public synchronized void take() {this.signals++;this.notify();}public synchronized void release() throws InterruptedException{while(this.signals == 0) wait();this.signals--;}}

四、有上限的Semaphore

上面的CountingSemaphore并沒有限制信號的數量。下面的代碼將CountingSemaphore改造成一個信號數量有上限的BoundedSemaphore。

public class BoundedSemaphore {private int signals = 0;private int bound = 0;public BoundedSemaphore(int upperBound){this.bound = upperBound;}public synchronized void take() throws InterruptedException{while(this.signals == bound) wait();this.signals++;this.notify();}public synchronized void release() throws InterruptedException{while(this.signals == 0) wait();this.signals--;this.notify();} }

在BoundedSemaphore中,當已經產生的信號數量達到了上限,take方法將阻塞新的信號產生請求,直到某個線程調用release方法后,被阻塞于take方法的線程才能傳遞自己的信號。

五、把Semaphore當鎖來使用

當信號量的數量上限是1時,Semaphore可以被當做鎖來使用。通過take和release方法來保護關鍵區域。請看下面的例子:

BoundedSemaphore semaphore = new BoundedSemaphore(1);...semaphore.take();try{//critical section } finally {semaphore.release(); }

在前面的例子中,Semaphore被用來在多個線程之間傳遞信號,這種情況下,take和release分別被不同的線程調用。但是在鎖這個例子中,take和release方法將被同一線程調用,因為只允許一個線程來獲取信號(允許進入關鍵區域的信號),其它調用take方法獲取信號的線程將被阻塞,知道第一個調用take方法的線程調用release方法來釋放信號。對release方法的調用永遠不會被阻塞,這是因為任何一個線程都是先調用take方法,然后再調用release。

通過有上限的Semaphore可以限制進入某代碼塊的線程數量。設想一下,在上面的例子中,如果BoundedSemaphore?上限設為5將會發生什么?意味著允許5個線程同時訪問關鍵區域,但是你必須保證,這個5個線程不會互相沖突。否則你的應用程序將不能正常運行。

必須注意,release方法應當在finally塊中被執行。這樣可以保在關鍵區域的代碼拋出異常的情況下,信號也一定會被釋放。

==>如有問題,請聯系我:easonjim#163.com,或者下方發表評論。<==

總結

以上是生活随笔為你收集整理的24、Java并发性和多线程-信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 妻子的性幻想 | 欧洲美女与动交ccoo | av不卡在线免费观看 | 一道本一区二区 | 午夜欧美精品 | 九一毛片| 性久久久 | 91狠狠| 日韩精品无码一区二区 | 国模私拍在线观看 | 伦理自拍| av资源网在线 | 国语对白一区 | 依依av| 国产欧美一区二区三区在线 | 国产资源久久 | 毛片基地在线观看 | 久久久久成人网站 | 中文字幕视频在线观看 | 奇米影视四色在线 | av成人亚洲 | 少妇人妻综合久久中文字幕 | 天天舔天天舔 | 日本老妇性生活 | 亚洲区视频在线观看 | 天天舔夜夜操 | 国产真人无遮挡作爱免费视频 | 麻豆一区产品精品蜜桃的特点 | 91精品久久久久久久久久入口 | 精品人伦一区二区三 | 五月婷婷中文 | 一区二区三区在线观看av | 国产成人精品一区二区三区网站观看 | 中文字幕在线免费看线人 | 国产精品久久久久久久久免费相片 | 少妇肥臀大白屁股高清 | 国产极品在线播放 | 精品人伦一区二区三区蜜桃免费 | 日本不卡一区二区在线观看 | 久伊人 | 国精产品一区一区三区有限公司杨 | 青草视屏| 九九热在线播放 | 国产综合av | 无人码人妻一区二区三区免费 | 夜夜操网站 | 无码国产色欲xxxxx视频 | 久久国产高清 | 亚洲成人av网址 | 国产八区 | 男女又爽又黄 | 在线 日本 制服 中文 欧美 | 国产剧情一区在线 | 韩国三级bd高清中字2021 | 一区三区在线 | 久久久久久久久久久久97 | 国产真实交换夫妇视频 | 爱爱小视频免费看 | 天天人人 | 91视频免费入口 | 国产偷人视频 | 麻豆网页 | 国产成人亚洲精品 | 久久久在线免费观看 | 国产高清视频在线 | 成人手机视频 | 国产精品久久77777 | 国产主播精品 | 波多野结衣中文字幕久久 | 成人免费a级片 | 欧美激情区 | 色欧美在线 | 欧美18—19性高清hd4k | 2020狠狠干 | 日韩在线视频网站 | 日本a级在线 | 亚洲第一综合 | 日韩精品高清在线 | 美国黄色一级大片 | 女人扒开屁股让我添 | 性色欲网站人妻丰满中文久久不卡 | 国产精品456 | 欧美日韩一区视频 | 男女视频在线观看免费 | 国产又粗又黄视频 | 日韩欧美不卡视频 | 午夜国产小视频 | 黄色www| caoprom97| 五月综合色 | 超碰caopor| 伦理亚洲 | 色噜噜狠狠成人中文 | 国模私拍大尺度裸体av | 欧美一区二区 | 国产-第1页-浮力影院 | 日韩动漫av| 男女爱爱福利视频 | 亚洲五月花 |