亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同步、易失性和(標記)鎖的 Java 內存模型交互

同步、易失性和(標記)鎖的 Java 內存模型交互

MMTTMM 2021-09-29 13:17:55
volatile使用鎖時是否需要修飾符來保證內存可見性?試圖完全理解并發性、內存可見性和執行控制我遇到了幾個消息來源說在synchronized塊中更新的變量不需要該字段volatile(大多數沒有提供來源,實際上有一頁說需要結合使用同步方法和波動性字段)。當接近jls 第 17.4.5 章時,我發現:兩個動作可以通過happens-before 關系排序。如果一個動作發生在另一個之前,那么第一個動作對第二個動作可見并在第二個動作之前排序。這部分是說后續同步方法調用保護相同的變量變量將確保它對第二個線程可見嗎?如果是這種情況,鎖也一樣嗎,因為我們也可以保證訂單?另一方面,當我們突然擁有允許 2 個線程訪問該字段的寫鎖時會發生什么。即使在變量被解鎖的情況下,整個構造是否會崩潰并且線程也永遠不會保證更新它們的緩存?簡而言之int field; //volatile not needed because we have a definite happens-before relationshipLock lock;void update(){    //No matter how many threads access this method they will always have     //the most up to date field value to work with.    lock.lock()    field *= 2;    lock.unlock();}
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

使用鎖時是否需要 volatile 修飾符以保證內存可見性?

volatile變量只保證內存可見性,但不保證原子性。這是Java 中塊volatilesynchronized塊的主要區別之一。因此,當您使用synchronized塊時,變量不必是volatile. 但是如果您的變量是volatile并且對該變量執行任何復合操作,那么您需要volatile使用鎖來保護對變量的更新。

這部分是說后續同步方法調用保護同一變量將確保它對第二個線程可見嗎?如果是這種情況,鎖也一樣嗎,因為我們也可以保證訂單?

是的。因為鎖會給你帶來可見性和原子性。

另一方面,當我們突然擁有允許 2 個線程訪問該字段的寫鎖時會發生什么。即使在變量被解鎖的情況下,整個構造是否會崩潰并且線程也永遠不會保證更新它們的緩存?

如果您在同一鎖上保護對變量的更新,則在任何給定時間只有一個線程可以處理該變量。所以它保證了一致性。但是如果每次都使用不同的鎖來保護那個變量,那么多個線程將修改變量狀態,并可能使變量狀態不一致。因此,在這種情況下,可見性和原子性都得到了保證,但仍然會導致不一致。


查看完整回答
反對 回復 2021-09-29
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

...實際上有一頁說同步方法和波動性字段需要結合使用。

您可以提煉出您需要了解的有關內存可見性和synchronized塊的所有信息,并將其歸結為一個簡單的規則。也就是說,線程 A 在退出synchronized (o) {...}塊之前對共享變量和對象所做的任何事情都保證在線程 B 進入同一對象synchronized (o) {...}塊時對線程 B 可見。 o

而且,正如@markspace 已經說過的,任何實現java.util.concurrent.locks.Lock都需要以相同的方式工作。


查看完整回答
反對 回復 2021-09-29
  • 3 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號