Semaphore
Semaphore,信號量。有時被稱爲信號燈,是在多線程環境下使用的一種設施,可以用來保證兩個或多個關鍵代碼段不被併發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量,一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量,其他想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。
舉例說明:
某廣場有3個停車位,過來了6輛車,因此會有3輛車暫時沒有車位,但是隻要車位被空出來,這3輛車還是有機會獲得車位的
Samaphore也可以用來用限流。即一次只允許有xx請求過來,多出的請求暫時等待直至被系統後續處理
構造方法摘要 |
---|
Semaphore(int permits) 用給定的許可數和非公平的公平設置創建一個 Semaphore 。 |
Semaphore(int permits, boolean fair) 用給定的許可數和給定的公平設置創建一個 Semaphore 。 |
permits,可獲得的信號量的總許可個數
fair,若信號量保證在爭用時保證按着先進先出的順序獲得許可,則爲true,否則false
常用方法摘要· |
---|
acquire() 從信號量處獲得一個許可(信號量許可個數-1) |
release() 釋放一個許可至信號量 (信號量許可個數+1) |
Semaphore能夠控制線程對某一資源的併發數量,線程通過acquire()獲得一個許可,release()釋放一個許可。如果被同時併發的數量已達飽和,則其他acquire()則進入等待狀態,直到有線程執行完任務調用release釋放許可之後,其他線程才能得到許可。
舉例:
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "佔到了車位~");
Thread.sleep((long) (Math.random()*1000));
System.out.println(Thread.currentThread().getName() + "走了,車位空出來了~");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, String.valueOf("線程" + i)).start();
}
}
}
結果:
線程1佔到了車位~
線程2佔到了車位~
線程3佔到了車位~
線程2走了,車位空出來了~
線程4佔到了車位~
線程1走了,車位空出來了~
線程5佔到了車位~
線程5走了,車位空出來了~
線程6佔到了車位~
線程3走了,車位空出來了~
線程6走了,車位空出來了~
線程4走了,車位空出來了~