3 回答

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

TA貢獻(xiàn)2019條經(jīng)驗 獲得超9個贊
return 語句需要對value執(zhí)行讀取操作。
對于大多數(shù)原語來說,讀取操作是原子的,但是您正在處理的是泛型,這意味著您不會知道value的類型。
因此,返回應(yīng)該是同步的。

TA貢獻(xiàn)1993條經(jīng)驗 獲得超6個贊
return value
不需要同步:
根據(jù)JLS ,對引用的讀取是原子的:“對引用的寫入和讀取始終是原子的,......”
value
根據(jù)Java 內(nèi)存模型value = newValue
,done.countDown()
每個線程讀取都done.await()
保證看到它的最新return value
值。value = newValue
因此通過及物性發(fā)生在之前return value
。
添加回答
舉報