簡體   English   中英

這個java類線程安全嗎? 並發讀寫

[英]Is this java class thread safe? Concurrent read and write

以下類線程是否安全? 我擔心並發讀取和寫入初始化變量。 如果它不是線程安全的,如何使其線程安全?

  1. 我知道將methodA轉換為synchronized會有所幫助,但我不想這樣做
  2. 如何將volatile volatile keywork添加到“initialized”變量?
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,那么只有在靜態(即類)變量上進行同步時,它才是線程安全的。

綜上所述:

  1. 如果在線程之間共享單個實例,則鎖定實例變量
  2. 如果線程正在創建“安全”類的實例並且靜態狀態可能被這些線程修改,那么必須鎖定靜態(類)變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM