簡體   English   中英

為什么 Java 允許用負許可初始化信號量?

[英]Why does Java allows to initialize semaphore with negative permit?

在信號量(java.util.concurrent.Semaphore)的初始化期間,我對負面許可的背后沒有理性。

我確實知道對 release() 方法的調用最終可能會使信號量的許可大於等於一(> = 1),以便稍后其他線程可以獲得許可。 或者稍后在程序執行期間,當更多線程在執行 acquire() 方法時等待許可時,Semaphore 可能有負面許可。

但是,我沒有得到任何實際用例,我將使用負許可初始化信號量。

示例代碼供參考:

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Semaphore s = new Semaphore(-2);
        System.out.println(s.availablePermits());
        s.release(3); // adding 3 permits
        System.out.println(s.availablePermits()); // now it has 1 permit        
    }
}

如果您在創建信號量時知道某些資源已經在使用,這可能會很有用。 例如初始化中使用的那些資源。

為什么 java 不能在信號量構造函數中允許負數? 信號量只是一種限制對某些資源的訪問的機制。 如果我們想從一開始就限制訪問,我們不妨將信號量初始化為負值,並確保暫時沒有線程會接觸該資源

javadoc很清楚:

@param 允許可用的初始許可數。

該值可能為負數,在這種情況下,必須在授予任何獲取之前進行釋放。

您可能處於一種情況,從一開始,您就需要等待某些資源打開並可用,然后才能開始使用它。


例如:假設您有 3 個線程正在構建您需要使用的文件。 此操作需要時間。 完成所有 3 個線程后,您才能繼續工作。 您必須等待這三個線程釋放信號量才能繼續工作。 現在,這可能不是一個好的解決方案,但至少可以處理負許可的初始信號量。


另一個具有相同咒語的示例發布在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM