Semaphore
Semaphore當前在多線程環境下被擴放使用,操作系統的信號量是個很重要的概念,在進程控制方面都有應用。Java 併發庫 的Semaphore 可以很輕鬆完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數。
Semaphore實現的功能就類似廁所有5個坑,假如有10個人要上廁所,那麼同時只能有多少個人去上廁所呢?同時只能有5個人能夠佔用,當5個人中 的任何一個人讓開後,其中等待的另外5個人中又有一個人可以佔用了。另外等待的5個人中可以是隨機獲得優先機會,也可以是按照先來後到的順序獲得機會,這取決於構造Semaphore對象時傳入的參數選項。單個信號量的Semaphore對象可以實現互斥鎖的功能,並且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用於死鎖恢復的一些場合。
Semaphore維護了當前訪問的個數,提供同步機制,控制同時訪問的個數。在數據結構中鏈表可以保存“無限”的節點,用Semaphore可以實現有限大小的鏈表。另外重入鎖 ReentrantLock 也可以實現該功能,但實現上要複雜些。
Semaphore(0)
代碼
new Thread() {
@Override
public void run() {
super.run();
try {
Log.d("silion", "_accountCheckSemaphore acquire start");
_accountCheckSemaphore.acquire();
Log.d("silion", "_accountCheckSemaphore acquire finish");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override
public void run() {
super.run();
for (int i = 0; i < 3; i++) {
Log.d("silion", "waiting : " + 1000 * (i+1));
SystemClock.sleep(1000);
}
Log.d("silion", "_accountCheckSemaphore release");
_accountCheckSemaphore.release();
}
}.start();
打印結果
silion: _accountCheckSemaphore acquire start
silion: waiting : 1000
silion: waiting : 2000
silion: waiting : 3000
silion: _accountCheckSemaphore release
silion: _accountCheckSemaphore acquire finish