免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

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

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

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

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

      示例代碼如下:

      /**

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

      */

      public class SemaphoreExample1 {

      // 請求的數(shù)量

      private static final int threadCount = 550;

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

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

      慢)

      ExecutorService threadPool = Executors.newFixedThreadPool(300);

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

      final Semaphore semaphore = new Semaphore(20);

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

      final int threadnum = i;

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

      try {

      semaphore.acquire();// 獲取一個許可,所以可運行線程數(shù)量為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 只是維持了一個可獲得許可證的數(shù)量。 Semaphore 經(jīng)常用于限制獲取某種資源的線程數(shù)量。

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

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

      test(threadnum);semaphore.release(5);// 獲取5個許可,所以可運行線程數(shù)量為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);

      }

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

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

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

      相關推薦

      聯(lián)系我們

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