我有一个可以被多个线程访问的类的实例。
在这个类内部是一个[ThreadStatic]变量,它存储各种对象。
我现在需要我的类的第二个实例,并且我希望它在其中有一个单独的对象存储。
目前,同一线程中的两个实例将共享同一对象存储。我不想这样。
我能想到的唯一解决方案是:
有一个静态的IDictionary<int, TObjectStore>,其中的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会简单地处理它,这是正确的吗?
谢谢
发布于 2012-01-12 20:47:02
静态字段实际上并不在任何实例中,所以我假设您现在需要一个实例字段。在这种情况下,您需要一个ThreadLocal<T>
ThreadLocal<SomeType> store = new ThreadLocal<SomeType>( () => {
// initializer, used when a new thread accesses the value
return ...
});这个存储将与实例一起可供收集,任何内容也是如此(显然,只要它们没有被引用到其他任何地方)。
发布于 2012-01-13 00:20:33
只是为了给Marc的答案http://blogs.clariusconsulting.net/kzu/a-better-way-to-implement-the-singleton-anti-pattern-for-easier-testing-using-ambientsingleton/提供更多的信息
这篇文章讨论了解决问题的各种方法,并给出了代码示例。
https://stackoverflow.com/questions/8835269
复制相似问题