[英]Can synchronized read be replaced with volatile field modifier?
在閱讀接受的答案時, 如何在Java中同步或鎖定變量? ,如果在下面的示例中使用volatile而不是同步塊,則行為是否會發生改變,這對我來說是偶然的。 我想確保消息始終返回正確的值。
讓我使用相同的示例:注意,現在我已經刪除了get方法中的同步塊,並將變量消息標記為volatile。
class Sample {
private volatile String message = null;
private final Object lock = new Object();
public void newMessage(String x) {
synchronized (lock) {
message = x;
}
}
public String getMessage() {
return message;
}
}
}
如果要更改上面顯示的代碼,是否可以保證相同的行為? 兩種方法之間有什么區別嗎?
先感謝您
在這種情況下, volatile
關鍵字就足夠了,因為它為讀寫建立了一個事前發生的關系,從而保證了一個線程中的寫入將被另一個線程中的后續讀取所觀察到。
synchronized
塊不是不正確,但它是冗余的。 另外,如果您確實使用synchronized
,則可以將消息變量標記為非易失性。 但是要小心,並確保讀取也處於synchronized
塊中,否則會導致數據爭用。 確保一個線程在synchronized
塊中進行的非易失性寫入對於隨后在同一監視器上進入synchronized
塊的線程可見。
最后一點, synchronized
塊與volatile
讀寫的進度條件不同。 前者處於阻塞狀態(互斥),而后者則無需等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.