Java中的訊號量


訊號量用於在執行程序時控制對共享資源的訪問。這是藉助計數器實現的。當此計數器值大於0時,允許訪問共享資源。另一方面,如果計數器值為零,則拒絕訪問共享資源。計數器基本上記錄它已授予共享資源的許可權數量。這意味著訊號量為執行緒提供對共享資源的訪問。

  • 訊號量位於java.util.concurrent包中。訊號量的概念是隱式實現的。
  • 如果訊號量的計數大於0,則執行緒可以訪問共享資源。訊號量的計數將同時遞減。否則,如果訊號量的計數不為0,則執行緒將被阻止訪問共享資源,直到訊號量釋放其他執行緒的訪問許可權。當執行緒不需要共享資源時,它會放棄其許可權。此時,訊號量的計數將遞增。如果另一個執行緒也需要訪問共享資源,它可以競爭訪問共享資源。

示例

以下是一個示例:

public class Demo {
   private boolean my_signal = false;
   public synchronized void accept() {
      this.my_signal = true;
      this.notify();
   }
   public synchronized void give_it() throws InterruptedException {
      while(!this.my_signal) wait();
      this.my_signal = false;
   }
}

“accept”方法用於傳送儲存在訊號量中的訊號。“give_it”函式等待訊號。當此函式接收到訊號時,其標誌被清除,控制從該函式退出。以這種方式使用訊號量,不會丟失任何訊號。

更新於:2020年9月14日

556 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告