Java併發工具類(信號量Semaphore)

併發工具類系列:java

Java併發工具類(閉鎖CountDownLatch)數據庫

Java併發工具類(柵欄CyclicBarrier)bash

Java併發工具類(信號量Semaphore)併發

定義

計數信號量用來控制同時訪問某個特定資源的操做數量,或者同時執行某個指定操做的數量。信號量還能夠用來實現某種資源池,或者對容器施加邊界。dom

Semaphore管理着一組許可(permit),許可的初始數量能夠經過構造函數設定,操做時首先要獲取到許可,才能進行操做,操做完成後須要釋放許可。若是沒有獲取許可,則阻塞到有許可被釋放。若是初始化了一個許可爲1Semaphore,那麼就至關於一個不可重入的互斥鎖(Mutex)。函數

實例場景

理論的聽起來有些繞口,其實假設生活中一個常見的場景:天天早上,你們都熱衷於帶薪上廁所,可是公司廁所一共只有10個坑位。。那麼只能同時10我的用着,後面來的人都得等着(阻塞),若是走了2我的,那麼又能夠進去2我的。這裏面就是Semaphore的應用場景,爭奪有限的資源。工具

代碼實戰

package concurrency;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;


class Employee implements Runnable {
    private String id;
    private Semaphore semaphore;
    private static Random rand= new Random(47);

    public Employee(String id, Semaphore semaphore) {
        this.id = id;
        this.semaphore = semaphore;
    }

    public void run() {
            try {
                semaphore.acquire();
                System.out.println(this.id + "is using the toilet");
                TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
                semaphore.release();
                System.out.println(this.id + "is leaving");
            } catch (InterruptedException e) {
            }
    }
}

public class ToiletRace {
    private static final int THREAD_COUNT = 30;

    private static ExecutorService threadPool = Executors
            .newFixedThreadPool(THREAD_COUNT);

    private static Semaphore s = new Semaphore(10);

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Employee(String.valueOf(i), s));
        }

        threadPool.shutdown();
    }
}

複製代碼

這裏我定義了30我的要上廁所,可是隻有10個坑位,每一個人消耗隨機的時間,直接運行上面這段代碼,能夠看到一開始進去了10我的,後來就是陸陸續續的有人進,有人出了。可是正在使用的必定不會超過10個的。post

Semaphore是很好用的Java併發工具,除了上面這個例子,咱們在工做中常常用它管理數據庫鏈接或者保護其它受限資源的併發使用。固然Semaphore還有其它的一些方法,能夠查看剩餘的許可數,能夠查看正在使用許可的線程數,具體使用時能夠查看官方文檔。ui

相關文章
相關標籤/搜索