[英]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.