Semaphore(信號(hào)量)的使用

信號(hào)量,是一種共享鎖,多個(gè)線程同時(shí)訪問(wèn)一個(gè)資源時(shí),通過(guò)它實(shí)現(xiàn)同一時(shí)刻的訪問(wèn)線程數(shù)量。最常見(jiàn)的使用場(chǎng)景就是高并發(fā)下的限流。

Semaphore常用方法說(shuō)明

acquire()  
獲取一個(gè)令牌,在獲取到令牌、或者被其他線程調(diào)用中斷之前線程一直處于阻塞狀態(tài)。

tryAcquire()
嘗試獲得令牌,返回獲取令牌成功或失敗,不阻塞線程。

availablePermits()
返回可用的令牌數(shù)量。

release()
釋放一個(gè)令牌,喚醒一個(gè)獲取令牌不成功的阻塞線程。
示例:

每個(gè)停車場(chǎng)入口都有一個(gè)提示牌,上面顯示著停車場(chǎng)的剩余車位還有多少,當(dāng)剩余車位為0時(shí),不允許車輛進(jìn)入停車場(chǎng),直到停車場(chǎng)里面有車離開(kāi)停車場(chǎng),這時(shí)提示牌上會(huì)顯示新的剩余車位數(shù)。

1、停車場(chǎng)容納總停車量10。
2、當(dāng)一輛車進(jìn)入停車場(chǎng)后,顯示牌的剩余車位數(shù)響應(yīng)的減1.
3、每有一輛車駛出停車場(chǎng)后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
4、停車場(chǎng)剩余車位不足時(shí),車輛只能在外面等待。

代碼:
public class SemaphoreUtil {
    private static Semaphore semaphore = new Semaphore(10);

    public static void main(String[] args) {
        for (int i=0;i<50;i++) {
            Thread thread = new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "到停車場(chǎng)門口");
                    if (semaphore.availablePermits() == 0) {
                        System.out.println("車位已滿");
                    }
                    //車位未滿,可以獲取進(jìn)入權(quán)限
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "進(jìn)入了停車場(chǎng)");
                    Thread.sleep(new Random().nextInt(10000));//模擬車輛在停車場(chǎng)停留的時(shí)間
                    System.out.println(Thread.currentThread().getName()+"駛出停車場(chǎng)");
                    semaphore.release(); //釋放令牌,更新空車位
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于dispatch_semaphore的使用 轉(zhuǎn)載請(qǐng)注明出處http://www.cnblogs.com/sna...
    airpoet閱讀 710評(píng)論 2 0
  • 信號(hào)量這個(gè)概念不太好理解 舉個(gè)??解釋: 以一個(gè)停車場(chǎng)是運(yùn)作為例。為了簡(jiǎn)單起見(jiàn),假設(shè)停車場(chǎng)只有三個(gè)車位,一開(kāi)始三個(gè)車...
    Chinesszz閱讀 191評(píng)論 0 1
  • 信號(hào)量概述(引用百度百科): 以一個(gè)停車場(chǎng)的運(yùn)作為例。簡(jiǎn)單起見(jiàn),假設(shè)停車場(chǎng)只有三個(gè)車位,一開(kāi)始三個(gè)車位都是空的。這...
    向天再借五公分閱讀 646評(píng)論 0 1
  • Semaphore 通常我們叫它信號(hào)量, 可以用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,通過(guò)協(xié)調(diào)各個(gè)線程,以保證合理的使...
    程序員札記閱讀 186評(píng)論 0 0
  • 1. 信號(hào)量Semaphore的介紹我們以一個(gè)停車場(chǎng)運(yùn)作為例來(lái)說(shuō)明信號(hào)量的作用。假設(shè)停車場(chǎng)只有三個(gè)車位,一開(kāi)始三個(gè)...
    xlhzj閱讀 531評(píng)論 0 0