2016-04-24 17 views
1

1.如果我在java中有一些同步方法,那麼如何通過信號量實現相同的方法,而不同步? (假設該方法是一個可變增量)在java中製作變量同步和可分解的問題

  1. 如何使某些變量對所有線程可見並且不使用synchronized關鍵字進行同步?

謝謝

回答

0

如果我有一些Java中的synchronized方法,我怎麼能實現通過信號燈的 同樣的方法,不同步? (假設該 方法是可變增量)

有一個信號作爲一個實例變量,當你進入方法獲得它,當鬆開你會帶着價值1 initalize它。這應該通過try-finally塊來實現,以確保發行沒有失敗。

如何在不使用synchronized關鍵字的情況下使某些變量對所有線程可見並同步 ?

您可以使用併發庫中可用的鎖定,也可以使其成爲一個volatile變量,以確保寫入對所有線程立即可見。但是如果多個線程可以寫入該易失性變量,您仍然需要額外的同步。

+0

如何在不同步的情況下同步它?通過信號量什麼的? –

+0

一種方法是使用RentrantLock。在寫入或讀取變量或一組變量之前,獲取此鎖並在完成時釋放鎖。這將確保對此變量(或組)的所有更改都是原子的,這也將確保在一個線程中進行的更改將對另一個線程可見,因爲它們都是同步的。 – Madhusudhan

1

1.如果我在java中有一些同步方法,如何通過信號量實現相同的方法,而不同步? (比方說,該方法是一種可變增量)

你可以使用一個二進制信號量(new Semaphore(1)),但你需要有一個明確的答案的問題爲什麼我要專門使用信號燈?

雖然二元信號可用於互斥,但它們與互斥不完全相同,因爲它們的主要用途主要與同步信號相關。作爲示例,release()不限於僅由最後成功獲得許可的線程調用。

2.如何使一些變量對所有線程可見並且不使用synchronized關鍵字進行同步?

有很多方法可以做到這一點,但不是枚舉它們,我會指出適用於它們的基礎語言機制。基本上,您需要保證the visibility, the ordering and the atomicity對變量所做的更改。

有一個所謂的發生的概念在你的程序執行過程中的排序,它可以用來推理當你寫入和從你的變量讀取變量時你會看到什麼值不同的線程。您可以說發生 - 在之前可以用來保證對變量所做更改的可見性和排序。

除此之外,您需要確保這些更改的原子性。您需要知道商店是原子的,但longdouble值除外,並且組合操作(例如使用++前綴或++後綴運算符遞增)不是原子的。有辦法解決這些問題,但除非你明白需要做什麼,否則你將無法瞭解某人提供的解決方案是如何工作的(以及它是否正確)。

Java語言規範的第17章(線程和鎖),更特別是其第17.4(內存模型)的解釋更多的細節什麼之前發生是,什麼是您可以在其中推論它的規則。

+0

所以互斥體更好? –

+0

互斥是更好的互斥(不是最大的啓示,我知道)。一般來說,使用正確的工具來完成這項工作。要做到這一點,首先了解什麼是工作,然後學習工具。在你的情況下,我強烈懷疑只使用'volatile'變量或一些'java.util.concurrent.atomic'類型就足夠了。 –