首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多线程设计模式

多线程设计模式
EN

Stack Overflow用户
提问于 2012-01-12 20:43:14
回答 2查看 1.3K关注 0票数 4

我有一个可以被多个线程访问的类的实例。

在这个类内部是一个[ThreadStatic]变量,它存储各种对象。

我现在需要我的类的第二个实例,并且我希望它在其中有一个单独的对象存储。

目前,同一线程中的两个实例将共享同一对象存储。我不想这样。

我能想到的唯一解决方案是:

有一个静态的IDictionary<int, TObjectStore>,其中的int是线程id,并通过一些方法或getter访问它:

代码语言:javascript
复制
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会简单地处理它,这是正确的吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-12 20:47:02

静态字段实际上并不在任何实例中,所以我假设您现在需要一个实例字段。在这种情况下,您需要一个ThreadLocal<T>

代码语言:javascript
复制
ThreadLocal<SomeType> store = new ThreadLocal<SomeType>( () => {
    // initializer, used when a new thread accesses the value
    return ...
});

这个存储将与实例一起可供收集,任何内容也是如此(显然,只要它们没有被引用到其他任何地方)。

票数 7
EN

Stack Overflow用户

发布于 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/提供更多的信息

这篇文章讨论了解决问题的各种方法,并给出了代码示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8835269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档