2014-06-17 80 views
2

bookTokens在下面的代碼中是線程安全的嗎?我不確定字符串數組的值是否可以以線程安全的方式讀取?是字符串數組線程安全嗎?

public Class Myclass{ 

    private static final String[] bookTokens = { "amazon", "manning", "book"}; 

    public static void methodOne(){ 
    //read values from bookTokens 
    } 


    public static void methodTwo(){ 
    //read values from bookTokens 
    } 

}

+0

字符串是不可變的,因此它們是線程安全的,StringBuilder除外 –

+5

數組不是不可變的。但如果你只是在閱讀,而不是寫作,那麼它是線程安全的。 – Blorgbeard

+0

[可能的重複](https://stackoverflow.com/questions/1132507/java-array-thread-safety) – ajp15243

回答

4

通常,陣列不是線程安全的。

但是,在這種情況下,我們有一個不會更新的數組,並且該數組的初始化方式可以確保與隨後讀取它的任何線程進行適當的同步。

因此,在這種情況下,代碼是線程安全的。

+0

「...並以確保正確同步的方式進行初始化...」是的。請參閱下面我對eitanfar的迴應,以獲得更詳細的解釋。 –

1

這個代碼僅線程安全的,如果你能保證有在MYCLASS沒有代碼,做等價的:

public static void mutateBookTokens() { 
     bookTokens[2] = "addison-wesley"; 
    } 
0

的任何代碼,只讀取值,並不會改變任何東西在本質上是線程安全的,因爲它使用的數據就像它是不可變的一樣使用。

+1

參見_Java Concurrency in Practice_作者:Brian Goetz等人,第3.5節。 (安全公佈)和第3.5.4節(有效不可變對象)。程序永遠不會修改的技術上可變的對象(例如上面例子中的數組)稱爲_effectively immutable_。使用有效的不可變對象是線程安全的_iff_對象是_safely published_。示例中的數組由於是通過發佈而被安全地發佈。一個'final'字段在它完全初始化之後。 –

+0

對於有效的不可變對象引用+1。謝謝 – Kaunteya