1. 程式人生 > >java多執行緒十 Semaphore

java多執行緒十 Semaphore

Semaphore類介紹

A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the Semaphore just keeps a count of the number available and acts accordingly.

從JavaDoc的釋義中我們可以總結如下幾點:
1. Semaphore是一個計數訊號量,允許n個任務同時訪問某個資源
2. 如果沒有達到可允許的執行緒數量,當前使用acquire()方法獲取許可,使用release()方法再訪問完後釋放許可
3. Semaphore並不存在真正的允許物件(permit objects),僅僅是維護了一個允許訪問的數量集

示例:

public class SemaphoreDemo {
    public static void main(String[] args) {
        final Semaphore semaphore = new
Semaphore(2); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; executorService.execute(new Runnable() { public void run() { try { semaphore.acquire(); // TODO:
System.out.println("執行緒:" + Thread.currentThread().getName() + "獲得許可:" + index); TimeUnit.SECONDS.sleep(3); semaphore.release(); System.out.println("允許TASK個數:" + semaphore.availablePermits()); } catch (InterruptedException e) { e.printStackTrace(); } } }); } executorService.shutdown(); } }

建構函式

public Semaphore(int permits) {
    sync = new NonfairSync(permits);
}

permits引數表示許可數,也就是最大訪問執行緒數。permits引數一經初始化就不能修改

public Semaphore(int permits, boolean fair) {
    sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}

permits引數上面已介紹。
fair預設值為false.表示獲取許可的順序是無序的,也就是說新縣城可能會比等待的老執行緒會先獲得許可;當設定為true時,訊號量保證它們呼叫的順序級先進先出

常用方法

  1. void acquire() 從訊號量獲取一個許可,如果無可用許可前 將一直阻塞等待
  2. void acquire(int permits) 獲取指定數目的許可,如果無可用許可前 也將會一直阻塞等待
  3. boolean tryAcquire() 從訊號量嘗試獲取一個許可,如果無可用許可,直接返回false,不會阻塞
  4. boolean tryAcquire(int permits) 嘗試獲取指定數目的許可,如果無可用許可直接返回false,
  5. boolean tryAcquire(int permits, long timeout, TimeUnit unit) 在指定的時間內嘗試從訊號量中獲取許可,如果在指定的時間內獲取成功,返回true,否則返回false
  6. void release() 釋放一個許可,別忘了在finally中使用,注意:多次呼叫該方法,會使訊號量的許可數增加,達到動態擴充套件的效果,如:初始permits 為1, 呼叫了兩次release,最大許可會改變為2
  7. int availablePermits() 獲取當前訊號量可用的許可

相關推薦

java執行 Semaphore

Semaphore類介紹 A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acq

java執行協作Semaphore

Semaphore的意思是訊號量, 多執行緒中使用此類控制併發量, 常用的方法有acquire() 和 release()  Semaphore沒有空參構造, 建立物件時必須傳入一個permits 值, 代表最大併發數; 當permits = 1 時 ,代表單執行緒 下面

java執行Semaphore

環境 java: 1.7 簡單使用 最近再看恆生給的demo,其中Semaphore因為我沒有使用過,就網上找了個通俗易懂的例子,自己消化下。 Semaphore中文表示的訊號量,用於對資源訪問

Java執行一 Exchanger

Exchanger類介紹 A synchronization point at which threads can pair and swap elements within pairs. Ea

Java執行五):CountDownLatch,Semaphore,Exchanger,CyclicBarrier,Callable和Future

CountDownLatch CountDownLatch用來使一個執行緒或多個執行緒等待到其他執行緒完成。CountDownLatch有個初始值count,await方法會阻塞執行緒,直到通過countDown方法呼叫使count減少為0才會執行await方法後面的程式碼。 示例程式碼 MyThread50

執行(二): 訊號量Semaphore

應用場景:多個執行緒使用數量有限的資源。 Semaphore是一種基於計數的訊號量。它可以設定一個閥值,基於此,多個執行緒競爭獲取許可訊號,做自己的申請後歸還,超過閥值後,執行緒申請許可訊號將會被阻塞。 Semaphore可以用來構建一些物件池,資源池之類的,比如資料庫連線池,我們

java基礎總結(三二)--java執行程式設計例項

來自:https://blog.csdn.net/qq_34996727/article/details/80416277或者https://www.cnblogs.com/pureEve/p/6524366.html 一.相關知識:   Java多執行緒程式設計到的知識:

java執行快速入門(一)

在方法上面加synchonizd用的是this鎖 package com.cppdy; class MyThread7 implements Runnable { private Integer ticketCount = 100; public boolean falg = tr

java執行快速入門(二)

在靜態方法上面加synchonizd用的是位元組碼檔案鎖 package com.cppdy; class MyThread8 implements Runnable { private static Integer ticketCount = 100; public boolea

java執行快速入門(六)

ThreadLocal關鍵字實現每個執行緒有自己的變數 package com.cppdy; class Number { private int num; public static ThreadLocal<Integer> threadLocal = new Th

java執行快速入門(八)

Lock鎖是JDK1.5之後推出的併發包裡面的關鍵字(注意捕獲異常,釋放鎖) Lock與synchronized的區別   Lock鎖可以人為的釋放鎖(相當於汽車中的手動擋)   synchronized當執行緒執行完畢或者丟擲異常的話,鎖自動釋放(相當於汽車中的自動擋) Condition用法  

java執行快速入門(二一)

CountDownLatch(閉鎖)計數器   有一個任務A,它要等待其他4個任務執行完畢之後才執行,此時就可以利用CountDownLatch來實現這種功能 package com.cppdy; import java.util.concurrent.CountDownLatch

java執行快速入門(二二)

執行緒池的好處:   避免我們過多的去new執行緒,new是佔資源的(GC主要堆記憶體)   提高效率   避免浪費資源   提高響應速度 作用:會把之前執行某個執行緒完畢的執行緒不會釋放掉會留到執行緒池中給下一個呼叫的執行緒直接使用 前提:AB執行緒在同一個執行緒池裡面;A執行緒執行完畢了,B執

201711671223《Java程式設計》第一週學習總結 第12章Java執行機制

201711671223《Java程式設計》第十一週學習總結 第12章Java多執行緒機制 作業系統與程序:程式是一段靜態的程式碼,它是應用軟體執行的藍本。程序是程式的一次動態執行過程,它對應了從程式碼載入、執行至執行完畢的一個完整過程,這個過程也是程序本身從產生、發展至消亡的過程。現代作業系統

java執行學習(一) 常見的單例模式執行安全性分析

類初始化鎖  怎麼理解? 為什麼需要了解? 常見的單例模式分析 懶漢式 為什麼執行緒不安全 驗證 餓漢式 為什麼執行緒安全 雙重檢查鎖定方式 演變由來 為什麼執行緒不安全 如何解決執行緒不安全 靜態類方式 為什麼執行緒安全 結

Java執行學習():AQS 原理以及 AQS 同步元件總結

常見問題:AQS 原理?;CountDownLatch和CyclicBarrier瞭解嗎,兩者的區別是什麼?用過Semaphore嗎? 本節思維導圖: 阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms

Java 執行高併發 3.3 — Semaphore 共享鎖使用

Semaphore 是共享鎖的一種,字面上意思就是訊號量鎖 顧名思義,一個可以共享的鎖,可以讓多個執行緒共享同一把鎖,例如同一條馬路可以讓 4 臺車同時並行跑,相當於可以讓 4 個執行緒共享一把鎖,臨

201711671125 Java執行例項(第一週)

建立3個售票視窗同時開始銷售10張票。 原始碼: public class One {     public static void main(String[] args) {         Ti

Java執行-新特徵-訊號量Semaphore

簡介 訊號量(Semaphore),有時被稱為訊號燈,是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。 概念 Semaphore分為單值和多值兩種,前者只能被一個執行緒獲得,後者可以被若干個執行緒獲得。 以一個停車場

一、Java執行併發同步之Semaphore

概念 Semaphore是一種在多執行緒環境下使用的設施,該設施負責協調各個執行緒,用來管理資源,以保證它們能夠正確、合理的使用公共資源的設施,也是作業系統中用於控制程序同步互斥的量。用我們常見的說法就是用來控制併發數。 訊號量是一個非負整數 。 業務場景 以售