我粘貼了一些關于 Java 并發的代碼:public class ValueLatch <T> { @GuardedBy("this") private T value = null; private final CountDownLatch done = new CountDownLatch(1); public boolean isSet() { return (done.getCount() == 0); } public synchronized void setValue(T newValue) { if (!isSet()) { value = newValue; done.countDown(); } } public T getValue() throws InterruptedException { done.await(); synchronized (this) { return value; } }}為什么return value;需要同步???return 語句不是原子的嗎?
3 回答

斯蒂芬大帝
TA貢獻1827條經驗 獲得超8個贊
返回不需要同步。由于CountDownLatch.countDown()
直到最后一次設置值之后才調用,因此CountDownLatch.await()
確保值在讀取和返回之前是穩定的。
寫這篇文章的開發人員可能不太確定他在做什么(并發是困難和危險的),或者更可能的是,他對GuardedBy
注釋的使用value
導致他的構建系統在 上發出警告return
,并且其他一些開發人員同步了它不必要地只是為了讓警告消失。
我說'其他一些開發人員',因為這個類似乎是專門設計為允許getValue()
在設置值后不鎖定繼續進行的。

慕少森
TA貢獻2019條經驗 獲得超9個贊
return 語句需要對value執行讀取操作。
對于大多數原語來說,讀取操作是原子的,但是您正在處理的是泛型,這意味著您不會知道value的類型。
因此,返回應該是同步的。

ibeautiful
TA貢獻1993條經驗 獲得超6個贊
添加回答
舉報
0/150
提交
取消