文檔總是非常明確地處理使用一個以上線程的對象的一個實例的問題。一個對象的多個實例的併發問題
但是,我需要知道什麼時候有一些線程同時擁有自己的實例?哪種干擾可能發生?我如何處理安靜昂貴的成員SimpleDateFormat
?
感謝 邁克 [;-)
文檔總是非常明確地處理使用一個以上線程的對象的一個實例的問題。一個對象的多個實例的併發問題
但是,我需要知道什麼時候有一些線程同時擁有自己的實例?哪種干擾可能發生?我如何處理安靜昂貴的成員SimpleDateFormat
?
感謝 邁克 [;-)
如果來自每個線程的代碼正在訪問同一類的不同實例(對象),那不是問題;除非當然,那些對象正在訪問共享對象,例如類靜態對象。
至於SimpleDateFormat
狀態的文檔:
日期格式不同步。建議爲每個線程創建單獨的格式實例。如果多個線程同時訪問一個格式,它必須在外部同步。
爲每個線程保留單獨實例的一種方法是使用一個ThreadLocal
對象來跟蹤單獨的實例。
如果每個線程都有它自己的實例,您不使用靜態,那麼你是非常安全的:-)
沒有併發性的問題!
對於您指出的SimpleDateFormat不是線程安全的,您可以選擇使用公用類FastDateFormat,它是線程安全的並且可以共享。
更籠統地說,如果您在線程之間共享對象,請務必確保它們被標記爲線程安全 - 文檔應該始終指明這一點。如果它們不是線程安全的,則需要限制對它們的併發訪問(例如,通過鎖定/同步)或使用多個實例(每個線程一個)。一般來說,如果你不這樣做,你就有可能會破壞共享數據/狀態並導致不確定的結果。
看來「大多數人」使用線程本地日期格式。例如:
private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
@Override public DateFormat initialValue() {
return new SimpleDateFormat("fm/ts/tr", Locale.US);
}
};