訊號量,個人理解它向乙個限制的意思,比如超過了某一設定好的標準就會無效,比如我們的在大學上學的時候,每年都舉行運動會,比如男子400公尺比賽,4個跑到,比如報名不足4個人則我們可以一次性跑完,但是如果多了,那麼多的只能等上一組跑完之後才能進行。閒話不多說,看下面幾個重要的實現。
訊號量底層實際使用了aqs(abstractqueuedsynchronizer) ,有乙個內部類syc,這個是實現的關鍵,首先看下幾個重要的方法,
1. final int nonfairtryacquireshared(int acquires)
}2. protected final boolean tryreleaseshared(int releases)
}這個個方法很重要,但是剛開始理解起來並不是那麼容易,下面是自己的理解:
1方法:此方法是獲取我們訊號的許可,其實這也說明了這是乙個共享鎖,getsate()獲取當前的許可數量,然後減去我們想要獲取的許可書就等於剩餘許可數量,如果許可數量<0 說明沒有跑道,或者沒有可用許可,那麼不好意思以後的就要進行等待。
2方法:釋放許可。之前不明白為什麼當前許可+釋放許可數,簡單理解就是比如我們宣告訊號量時傳入5,說明最多也就是5個訊號量,比如此時還沒有進行獲取訊號量就呼叫可此方法,那麼得到當前可用許可數量為0,那麼下乙個就是1,所以此時通過cas操作可用許可變為1,以此類推,當我們可用許可達到5時,這一組釋放完全退出。
public static void main(string args) catch (interruptedexception e)
} };
exec.execute(run);
} try catch (interruptedexception e)
// 退出執行緒池
exec.shutdown();
Semaphore原理分析
aqs 共享模式分析 訊號量semaphore是乙個控制訪問多個共享資源的計數器,和countdownlatch一樣,本質上是一種共享鎖。舉個例子,還是生產者消費者的例子,假設緩衝區的大小是100,然後可以實現多個生產者和消費者同時進行工作,只要100個資源沒有使用完,生產者就可以繼續生產,而在之前...
Semaphore原始碼分析
semaphore有兩種模式,公平模式和非公平模式。公平模式就是呼叫acquire的順序就是獲取許可證的順序,遵循fifo 而非公平模式是搶占式的,也就是有可能乙個新的獲取執行緒恰好在乙個許可證釋放時得到了這個許可證,而前面還有等待的執行緒。semaphore有兩個構造方法,如下 public se...
原始碼分析 Semaphore
計數訊號量,從概念上說,訊號量維持了一些許可。public class semaphoretest start protected void getinfo catch exception e finally 他會2每秒列印10個值,沒10個執行緒 獲取許可,其他執行緒會被阻塞在semaphore....