2013-02-15 49 views
5

我正在進入Java中的信號量並正在讀這篇文章http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html。我沒有得到的唯一原因是爲什麼在同步上下文中不使用acquire()方法。從上面的網站看一下例子:爲什麼Semaphores中的acquire()方法不必同步?

他們創造一個信號:

private Semaphore semaphore = new Semaphore(100); 

和得到的只是這樣一個許可證:

semaphore.acquire(); 

現在,是不是很可能兩個或更多的線程嘗試同時獲取()?如果是這樣,那麼計數會有一點問題。

或者,信號量本身是否處理同步?

回答

3

或者,信號量本身是否處理同步?

是的,基本上就是這樣。調用「釋放」方法,如發行()發生,之前的行動在成功地「獲取」的方法,如獲取之前,操作中的一個線索:

內存一致性效果:在the javadoc解釋的信號量是線程安全的()在另一個線程中。

java.util.concurrent包中的對象的大多數操作都是線程安全的。在package javadoc的最底部提供更多細節。

3

信號應該很快,因此使用Unsafe類的原子併發基元,如CAS (compare and swap)

由於這些原語同步發生在低得多的水平,並且不需要監視器。 (無鎖同步)。

事實上,同步是由一個循環連續執行,使用CAS直到期望值等於寫入/讀取值。

0

同步通過的AbstractQueuedSynchronizer與CAS操作保證

看到javadoc這裏

相關問題