Java 中的信號量和閉鎖都是多線程編程中常用的輔助工具,可以協調線程之間的執行順序和互斥訪問共享資源。
public class Semaphore { private final int permits; private final boolean fair; private final Dequequeue; private int count; public Semaphore(int permits, boolean fair) { this.permits = permits; this.fair = fair; this.queue = new LinkedList<>(); this.count = 0; } public Semaphore(int permits) { this(permits, false); } public synchronized void acquire() throws InterruptedException { queue.addLast(Thread.currentThread()); while (queue.getFirst() != Thread.currentThread() || count == permits) { wait(); } queue.removeFirst(); count++; } public synchronized void release() { count--; notifyAll(); } }
信號量是一種控制訪問有限資源的機制,允許同時有多個線程訪問同一個資源,但是要限制資源被訪問的個數。Java 的信號量實現類 Semaphore 就是一種常見的工具類,其中 permits 表示許可的數量,fair 表示是否公平地分配許可,queue 就是保存等待線程的隊列,count 就是當前可用的許可數量。acquire 方法表示線程獲得許可的操作,如果沒有許可可用,則線程將會阻塞在隊列中,等待其它線程的許可釋放,直到自己成為隊列首部的線程,此時才能獲得許可并執行操作。release 方法表示線程釋放許可的操作,喚醒等待隊列中的線程,并將許可數量加一。
public class CountDownLatch { private final int count; private volatile int remaining; public CountDownLatch(int count) { this.count = count; this.remaining = count; } public synchronized void await() throws InterruptedException { while (remaining >0) { wait(); } } public synchronized void countDown() { if (remaining >0) { remaining--; } if (remaining == 0) { notifyAll(); } } }
閉鎖是一種等待一組操作完成的機制,將需要等待的操作數量設置為 count,每當一個操作完成后,就調用 countDown 方法將計數器減一。當計數器為零時,await 方法將會返回,表示所有操作已經完成。Java 的閉鎖實現類 CountDownLatch 就是一種常見的工具類,其中 count 就是需要等待的操作數量,remaining 就是當前還未完成的操作數量。await 方法表示線程等待操作完成的操作,如果還有未完成的操作,則線程將會阻塞,直到所有的操作都已經完成。countDown 方法表示操作完成的操作,將 remaining 減一,并喚醒等待的線程。