[英]Is this java class thread safe? Concurrent read and write
以下類線程是否安全? 我擔心並發讀取和寫入初始化變量。 如果它不是線程安全的,如何使其線程安全?
public class A {
private boolean initialized;
public synchronized void init(String configFilePath) {
if (initialized) {
return;
}
initialized = true;
}
public void methodA() {
if (!initialized) {
throw new ConfigurationException()
}
}
}
Update1:初始化變量只在init方法中修改一次,所有其他方法只准備好。 如果是這種情況,將volatile添加到初始化將使其線程安全,這是正確的嗎?
不,它不是線程安全的。 調用methodA
時, init
例程可能處於initialized
設置的中間。 由於methodA
不同步,因此沒有什么能阻止執行initialized = true
和read in if( !initialized)
之間的競爭。 事實上,寫入甚至可能已經發生但尚未傳播到調用methodA
的線程
將volatile
添加到initialized
將有助於值傳播問題,但不會與第一個有關。
有關這方面的更多信息,我推薦Brian Goetz的文章Managing Volatility 。
不,它不是線程安全的。 你必須同步。
@HotLicks 100%正確。 有關並發的任何問題都需要提供上下文。 原因如下:
讓我們假設一個類已被編寫為“安全”(暫時忽略OP類)。 如果要在實例變量上進行同步,並且該類的實例由許多線程共享,那么它將是線程安全的。 但是,如果可以創建類的多個實例(由不同的線程),並且它們可能修改靜態變量/ state,那么只有在靜態(即類)變量上進行同步時,它才是線程安全的。
綜上所述:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.