多线程设计模式

4
我有一个可以被多个线程访问的类实例。
这个类里有一个 [ThreadStatic] 变量,它存储着各种对象。
现在我需要第二个实例,我希望它有一个独立的对象存储。
目前,在同一线程中的两个实例将共享相同的对象存储。我不希望出现这种情况。
我能想到的唯一解决办法是:
建立一个 static IDictionary,其中 int 是线程 ID,并通过某个方法或 getter 访问它:
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会自动回收它,我的想法正确吗?
谢谢。
2个回答

7

静态字段实际上并不存在于 任何 实例中,因此我认为您现在需要一个实例字段。在这种情况下,您需要使用 ThreadLocal<T>

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

此存储库将随实例一起提供,以及其中的任何内容(只要它们在其他地方没有被引用)。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接