2014-05-21 75 views
0

我正在從運行嵌套類的多個線程訪問私有字符串字段。Java:String對象的線程安全

我知道String對象是不可變的,所以傳遞String作爲參數應該總是安全的。但如何訪問完全相同的領域?我認爲它不是線程安全的?

回答

1

它仍然是線程安全的,因爲您只能訪問該字段。如果某個線程會嘗試修改字段(其狀態或更改整個對象引用),而其他線程同時獲取此變量的值,則問題將會發生。

通常情況下,需要創建一個實現Runnable類,並通過必要的參數:

class MyTask implements Runnable { 
    private final String needThis; 
    public MyTask(String needThis) { 
     this.needThis = needThis; 
    } 
    @Override 
    public void run() { 
     //do your task using needThis variable here... 
    } 
} 

這可以適用於其他類型的參數,以及。此外,最好發送不可變類的對象引用(如String)作爲線程的數據。

+0

好的,當然是。但我想以一種可能的未來調整不會破壞我的代碼的方式進行編碼:)。所以將String傳遞給Runnable的構造函數可能是更好的方法?! – user3541377

+0

@ user3541377是的。 –

+0

使用stringbuffer –

2

如果您只是在閱讀領域,它始終是線程安全的。 使字段最終確定,以便編譯器檢查您是否正在更改值?

private final String theField = "TheValue" 
+0

另一個好方法,但在我的情況下,字符串是動態設置的,所以我會用另一種方式。 – user3541377