3 回答

TA貢獻1825條經驗 獲得超6個贊
使用鎖時是否需要 volatile 修飾符以保證內存可見性?
volatile
變量只保證內存可見性,但不保證原子性。這是Java 中塊volatile
和synchronized
塊的主要區別之一。因此,當您使用synchronized
塊時,變量不必是volatile
. 但是如果您的變量是volatile
并且對該變量執行任何復合操作,那么您需要volatile
使用鎖來保護對變量的更新。
這部分是說后續同步方法調用保護同一變量將確保它對第二個線程可見嗎?如果是這種情況,鎖也一樣嗎,因為我們也可以保證訂單?
是的。因為鎖會給你帶來可見性和原子性。
另一方面,當我們突然擁有允許 2 個線程訪問該字段的寫鎖時會發生什么。即使在變量被解鎖的情況下,整個構造是否會崩潰并且線程也永遠不會保證更新它們的緩存?
如果您在同一鎖上保護對變量的更新,則在任何給定時間只有一個線程可以處理該變量。所以它保證了一致性。但是如果每次都使用不同的鎖來保護那個變量,那么多個線程將修改變量狀態,并可能使變量狀態不一致。因此,在這種情況下,可見性和原子性都得到了保證,但仍然會導致不一致。

TA貢獻1797條經驗 獲得超6個贊
...實際上有一頁說同步方法和波動性字段需要結合使用。
您可以提煉出您需要了解的有關內存可見性和synchronized
塊的所有信息,并將其歸結為一個簡單的規則。也就是說,線程 A 在退出synchronized (o) {...}
塊之前對共享變量和對象所做的任何事情都保證在線程 B 進入同一對象的synchronized (o) {...}
塊時對線程 B 可見。 o
而且,正如@markspace 已經說過的,任何實現java.util.concurrent.locks.Lock
都需要以相同的方式工作。
添加回答
舉報