在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Semaphore(信號量)-允許多個線程同時訪問

    Semaphore(信號量)-允許多個線程同時訪問

    synchronized 和 ReentrantLock 都是一次只允許一個線程訪問某個資源,Semaphore(信號量)可以

    指定多個線程同時訪問某個資源。

    示例代碼如下:

    /**

    * @Description: 需要一次性拿一個許可的情況

    */

    public class SemaphoreExample1 {

    // 請求的數量

    private static final int threadCount = 550;

    public static void main(String[] args) throws InterruptedException {

    // 創(chuàng)建一個具有固定線程數量的線程池對象(如果這里線程池的線程數量太少的話你會發(fā)現執(zhí)行得很

    慢)

    ExecutorService threadPool = Executors.newFixedThreadPool(300);

    // 一次只能允許執(zhí)行一次線程數量。

    final Semaphore semaphore = new Semaphore(20);

    for (int i = 0; i < threadCount; i++) {

    final int threadnum = i;

    threadPool.execute(() -> {// Lambda 表達式的運用

    try {

    semaphore.acquire();// 獲取一個許可,所以可運行線程數量為20/1=20test(threadnum);

    semaphore.release();// 釋放一個許可

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    });

    }

    threadPool.shutdown();

    System.out.println(“finish”);

    }

    public static void test(int threadnum) throws InterruptedException {

    Thread.sleep(1000);// 模擬請求的耗時操作

    System.out.println(“threadnum:” + threadnum);

    Thread.sleep(1000);// 模擬請求的耗時操作

    }

    }

    執(zhí)行 acquire 方法阻塞,直到有一個許可證可以獲得然后拿走一個許可證;每個 release 方法增加一個許可證,這可能會釋放一個阻塞的信息 acquire 方法。然而,其實并沒有實際的許可證這個對象,Semaphore 只是維持了一個可獲得許可證的數量。 Semaphore 經常用于限制獲取某種資源的線程數量。

    當然一次也可以一次拿取和釋放多個許可,不過一般沒有必要這樣做:

    semaphore.acquire(5);// 獲取5個許可,所以可運行線程數量為20/5=4

    test(threadnum);semaphore.release(5);// 獲取5個許可,所以可運行線程數量為20/5=4

    除了 acquire 方法之外,另一個比較常用的與之對應的方法是 tryAcquire 方法,該方法如果獲取不到許可就立即返回 false。Semaphore 有兩種模式,公平模式和非公平模式。

    公平模式: 調用 acquire 的順序就是獲取許可證的順序,遵循 FIFO;

    非公平模式: 搶占式的。

    Semaphore 對應的兩個構造方法如下:

    public Semaphore(int permits) {

    sync = new NonfairSync(permits);

    }

    public Semaphore(int permits, boolean fair) {

    sync = fair ? new FairSync(permits) : new NonfairSync(permits);

    }

    這兩個構造方法,都必須提供許可的數量,第二個構造方法可以指定是公平模式還是非公平模式,默認非公平模式。

    【關注】轉發(fā)了解更多內容,方便后續(xù)查看

    鄭重聲明:本文內容及圖片均整理自互聯網,不代表本站立場,版權歸原作者所有,如有侵權請聯系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年7月4日 12:20
    下一篇 2022年7月4日 12:21

    相關推薦

    聯系我們

    聯系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息