Java Semaphore 信号量
生活随笔
收集整理的這篇文章主要介紹了
Java Semaphore 信号量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java Semaphore 信號量
Semaphore 是一種基于計數的信號量。它可以設定一個閾值,基于此,多個線程競爭獲取許可信號,做完自己的申請后歸還,超過閾值后,線程申請許可信號將會被阻塞。Semaphore 可以用來構建一些對象池,資源池之類的,比如數據庫連接池。
Semaphore通過 acquire()與release()方法來獲得和釋放臨界資源。
Semaphore 也提供了公平與非公平鎖的機制,也可在構造函數中進行設定
使用Semaphore實現互斥鎖
我們也可以創建計數為 1 的 Semaphore,將其作為一種類似互斥鎖的機制,這也叫二元信號量,表示兩種互斥狀態。
public class test {private int num = 100;//同一時間下只允許一個線程訪問private Semaphore s = new Semaphore(1);public void decrement(){try {s.acquire();int i =10;while (i>0) {num--;i--;System.out.println(Thread.currentThread().getName() + "==>" + num);System.out.println("當前排隊等待的線程個數:" + s.getQueueLength());}} catch (InterruptedException e) {e.printStackTrace();}finally {s.release();}}public static void main(String[] args) {test t = new test();new Thread(()->{t.decrement();},"A").start();new Thread(()->{t.decrement();},"B").start();new Thread(()->{t.decrement();},"C").start();new Thread(()->{t.decrement();},"D").start();new Thread(()->{t.decrement();},"E").start();} }Semaphore主要方法
- public void acquire(): 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。
- public void acquire(int permits):獲取 permits 個許可
- public void release() { } :釋放許可。注意,在釋放許可之前,必須先獲獲得許可。
- public void release(int permits) { }:釋放 permits 個許可上面 4 個方法都會被阻塞,如果想立即得到執行結果,可以使用下面幾個方法13/04/2018
- public boolean tryAcquire():嘗試獲取一個許可,若獲取成功,則立即返回 true,若獲取失敗,則立即返回 false
- public boolean tryAcquire(long timeout, TimeUnit unit):嘗試獲取一個許可,若在指定的時間內獲取成功,則立即返回 true,否則則立即返回 false
- public boolean tryAcquire(int permits):嘗試獲取 permits 個許可,若獲取成功,則立即返回 true,若獲取失敗,則立即返回 false
- public boolean tryAcquire(int permits, long timeout, TimeUnit unit): 嘗試獲取 permits個許可,若在指定的時間內獲取成功,則立即返回 true,否則則立即返回 false
- availablePermits()方法得到可用的許可數目。
總結
以上是生活随笔為你收集整理的Java Semaphore 信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸡蛋花花语寓意着什么
- 下一篇: java美元兑换,(Java实现) 美元