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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocurrent包semaphore信号量

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocurrent包semaphore信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

semaphore
英[?sem?f?:(r)]
美[?s?m??f?r, -?for]
n. 臂板信號系統,(鐵道)臂板信號裝置;

?

?

Semaphore 用法

信號量主要有兩種用途:

  • 保護一個重要(代碼)部分防止一次超過 N 個線程進入。
  • 在兩個線程之間發送信號。
  • 保護重要部分

    如果你將信號量用于保護一個重要部分,試圖進入這一部分的代碼通常會首先嘗試獲得一個許可,然后才能進入重要部分(代碼塊),執行完之后,再把許可釋放掉。比如這樣:

    [java]?view plaincopy
  • Semaphore?semaphore?=?new?Semaphore(1);??
  • ??
  • //critical?section??
  • semaphore.acquire();??
  • ??
  • ...??
  • ??
  • semaphore.release();??
  • ?

    在線程之間發送信號

    如果你將一個信號量用于在兩個線程之間傳送信號,通常你應該用一個線程調用 acquire() 方法,而另一個線程調用 release() 方法。
    如果沒有可用的許可,acquire() 調用將會阻塞,直到一個許可被另一個線程釋放出來。同理,如果無法往信號量釋放更多許可時,一個 release() 調用也會阻塞。
    通過這個可以對多個線程進行協調。比如,如果線程 1 將一個對象插入到了一個共享列表(list)之后之后調用了 acquire(),而線程 2 則在從該列表中獲取一個對象之前調用了 release(),這時你其實已經創建了一個阻塞隊列。信號量中可用的許可的數量也就等同于該阻塞隊列能夠持有的元素個數。

    公平

    沒有辦法保證線程能夠公平地可從信號量中獲得許可。也就是說,無法擔保掉第一個調用 acquire() 的線程會是第一個獲得一個許可的線程。如果第一個線程在等待一個許可時發生阻塞,而第二個線程前來索要一個許可的時候剛好有一個許可被釋放出來,那么它就可能會在第一個線程之前獲得許可。
    如果你想要強制公平,Semaphore 類有一個具有一個布爾類型的參數的構造子,通過這個參數以告知 Semaphore 是否要強制公平。強制公平會影響到并發性能,所以除非你確實需要它否則不要啟用它。
    以下是如何在公平模式創建一個 Semaphore 的示例:

    [java]?view plaincopy
  • Semaphore?semaphore?=?new?Semaphore(1,?true);??
  • ?

    更多方法

    java.util.concurrent.Semaphore 類還有很多方法,比如:

    • availablePermits()
    • acquireUninterruptibly()
    • drainPermits()
    • hasQueuedThreads()
    • getQueuedThreads()
    • tryAcquire()
    • 等等

    這些方法的細節請參考 Java 文檔。

    ?

    轉載于:https://www.cnblogs.com/panxuejun/p/8566027.html

    總結

    以上是生活随笔為你收集整理的cocurrent包semaphore信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

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