2012-01-12 110 views
4

我有一個可以被多個線程訪問的類的實例。多線程設計模式

這個類內部是一個[ThreadStatic]變量,它存儲各種對象。

我現在需要我的班級的第二個實例,我希望它有一個單獨的對象存儲在裏面。

目前,同一個線程中的兩個實例將共享同一個對象存儲。我不想要這個。

我能想到的唯一的解決辦法是:

有一個靜態IDictionary<int, TObjectStore>其中int是線程ID,並通過一些方法或吸氣訪問此:

static TObjectStore ObjectStore { 
    get { 
     // create the instance here if its the first-access from this thread, with locking etc. for safety 
     return objectStore[Thread.CurrentThread.Id]; 
    } 
} 

這個雖然問題當特定線程結束時,如何處理TObjectStore?我認爲我正確地認爲,在我目前的實施中,GC會簡單地撿起它?

感謝

回答

7

靜態字段是不是真的在任何實例,所以我想你現在需要一個實例字段。在這種情況下,你想有一個ThreadLocal<T>

ThreadLocal<SomeType> store = new ThreadLocal<SomeType>(() => { 
    // initializer, used when a new thread accesses the value 
    return ... 
}); 

這家店將可用於收集與實例一起,如將任何內容(只要他們沒有其他地方引用,很明顯)。

+0

TIL關於'ThreadLocal <>' – 2012-01-12 13:54:18