2009-12-03 59 views
1

文檔總是非常明確地處理使用一個以上線程的對象的一個​​實例的問題。一個對象的多個實例的併發問題

但是,我需要知道什麼時候有一些線程同時擁有自己的實例?哪種干擾可能發生?我如何處理安靜昂貴的成員SimpleDateFormat

感謝 邁克 [;-)

回答

7

如果來自每個線程的代碼正在訪問同一類的不同實例(對象),那不是問題;除非當然,那些對象正在訪問共享對象,例如類靜態對象。

至於SimpleDateFormat狀態的文檔:

日期格式不同步。建議爲每個線程創建單獨的格式實例。如果多個線程同時訪問一個格式,它必須在外部同步。

爲每個線程保留單獨實例的一種方法是使用一個ThreadLocal對象來跟蹤單獨的實例。

3

如果每個線程都有它自己的實例,您不使用靜態,那麼你是非常安全的:-)

沒有併發性的問題!

1

對於您指出的SimpleDateFormat不是線程安全的,您可以選擇使用公用類FastDateFormat,它是線程安全的並且可以共享。

更籠統地說,如果您在線程之間共享對象,請務必確保它們被標記爲線程安全 - 文檔應該始終指明這一點。如果它們不是線程安全的,則需要限制對它們的併發訪問(例如,通過鎖定/同步)或使用多個實例(每個線程一個)。一般來說,如果你不這樣做,你就有可能會破壞共享數據/狀態並導致不確定的結果。

0

看來「大多數人」使用線程本地日期格式。例如:

private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() { 
    @Override public DateFormat initialValue() { 
     return new SimpleDateFormat("fm/ts/tr", Locale.US); 
    } 
};