欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java信號量全解析

 更新時間:2021年01月22日 09:25:55   作者:無才的小易  
這篇文章主要介紹了Java信號量的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

前言:

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

內容主題:

一、簡單的Semaphore實現(xiàn)

下面是一個信號量的簡單實現(xiàn):

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

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

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

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

二、使用Semaphore來產生信號

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

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 signal
this.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的簡單實現(xiàn)并沒有計算通過調用take方法所產生信號的數量。可以把它改造成具有計數功能的Semaphore。下面是一個可計數的Semaphore的簡單實現(xiàn)。

public class CountingSemaphore {
private int signals = 0;
public synchronized void take() {
this.signals++;0809this.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方法來保護關鍵區(qū)域。請看下面的例子:

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

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

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

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

以上就是Java信號量全解析的詳細內容,更多關于Java信號量的資料請關注腳本之家其它相關文章!

相關文章

  • Intellij?IDEA根據maven依賴名查找它是哪個pom.xml引入的(圖文詳解)

    Intellij?IDEA根據maven依賴名查找它是哪個pom.xml引入的(圖文詳解)

    這篇文章主要介紹了Intellij?IDEA根據maven依賴名查找它是哪個pom.xml引入的,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Java并發(fā)容器之ConcurrentLinkedQueue詳解

    Java并發(fā)容器之ConcurrentLinkedQueue詳解

    這篇文章主要介紹了Java并發(fā)容器之ConcurrentLinkedQueue詳解,加鎖隊列的實現(xiàn)較為簡單,這里就略過,我們來重點來解讀一下非阻塞隊列,
    從點到面, 下面我們來看下非阻塞隊列經典實現(xiàn)類ConcurrentLinkedQueue,需要的朋友可以參考下
    2023-12-12
  • Java中的模板模式說明與實現(xiàn)

    Java中的模板模式說明與實現(xiàn)

    這篇文章主要介紹了Java中的模板模式說明與實現(xiàn),模板方法模式,又叫模板模式,在一個抽象類公開定義了執(zhí)行它的方法的模板,它的子類可以更需要重寫方法實現(xiàn),但可以成為典型類中定義的方式進行,需要的朋友可以參考下
    2023-10-10
  • 使用JavaConfig代替xml實現(xiàn)Spring配置操作

    使用JavaConfig代替xml實現(xiàn)Spring配置操作

    這篇文章主要介紹了使用JavaConfig代替xml實現(xiàn)Spring配置操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot項目如何設置權限攔截器和過濾器

    SpringBoot項目如何設置權限攔截器和過濾器

    這篇文章主要介紹了使用lombok時如何自定義get、set方法問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 關于SpringGateway調用服務 接受不到參數問題

    關于SpringGateway調用服務 接受不到參數問題

    這篇文章主要介紹了關于SpringGateway調用服務接受不到參數問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot2.0整合WebSocket代碼實例

    SpringBoot2.0整合WebSocket代碼實例

    這篇文章主要介紹了SpringBoot2.0整合WebSocket代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java中“==“和equals()的區(qū)別詳解

    java中“==“和equals()的區(qū)別詳解

    這篇文章主要給大家介紹了關于java中“==“和equals()區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java中內部類的概念與分類詳解

    Java中內部類的概念與分類詳解

    一個類的定義放在另一個類的內部,這個類就叫做內部類,下面這篇文章主要給大家介紹了關于Java中內部類的概念與分類的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Java使用FFmpeg處理視頻文件的方法教程

    Java使用FFmpeg處理視頻文件的方法教程

    這篇文章主要給大家介紹了關于Java使用FFmpeg處理視頻文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03

最新評論