2012-10-29 58 views
8

所以,如果我有是一個靜態最終char []線程安全嗎?

private static final char[] SOME_CHARS; 

那是線程安全的?我的意思是,如果我有多個線程引用該數組中的字符(但不改變它們),是否會出錯?

例如

private class someThread extends Thread(){ 


    public void run(){ 
    for(int i = 0; i < someIndexInSomeChars;i++){ 
     System.out.println(SOME_CHARS[i]); 
    } 
} 

換句話說我是否需要將char []放入某種具有線程支持的Java集合?

+1

沒有問題。 '字符串'雖然是一種確定的不可變數據類型,因此更安全。即使更改字符也可以。 –

+0

我調整了標題以關閉代碼 - 'char []'而不是'Char []'。我認爲這就是你的真正意思? –

+0

是的 - 對不起,這是一個錯字 - 我也要添加最後的標題 – praks5432

回答

10

如果你在初始化後不改變它們,它應該沒問題。 (請注意,這依賴於它是一個static final變量 - 那類初始化將確保所有線程正確地看到初始化數組引用的方式)

數組是安全從多個線程讀取。如果你不介意看到陳舊的結果,你甚至可以從多個線程寫出 - 你不會最終「破壞」集合本身。 (與許多其他集合不同,無論如何你都不能改變數組的大小......除了元素本身之外沒有其他修改的狀態)。

+0

嗯如果我把字符串放入字符串中,該怎麼辦? So String =「someStuff」+ SOME_CHARS [i]「;然後在某個時刻返回String?我不認爲這是一個問題,因爲新的String應該有一個新的char,而不是對舊char的引用 - 是這種情況嗎? – praks5432

+0

@ praks5432:沒關係,現在還不清楚「new char」和「old char」是什麼意思......不要忘記'char'是一種原始類型... –

+0

嗯,所以我想我問這個 - 如果我用同一個字符做不同的事情,我得到的數組中的同一個索引,那麼我保證該數組不會改變? – praks5432