首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >还是并发对象池?

还是并发对象池?
EN

Stack Overflow用户
提问于 2016-01-25 10:27:02
回答 3查看 2.9K关注 0票数 4

哪种方法更适合访问非线程安全对象

使用ThreadLocal对象:

代码语言:javascript
复制
static final ThreadLocal<NonThreadSafeParser> PARSER_THREAD_LOCAL = new ThreadLocal<NonThreadSafeParser>() {
    @Override
    protected NonThreadSafeParser initialValue() {
        return new NonThreadSafeParser();
    }
};

void parse(String input) {
    PARSER_THREAD_LOCAL.get().parse(input);
}

使用并发对象池

代码语言:javascript
复制
static final ConcurrentObjectPool<NonThreadSafeParser> PARSER_POOL = new ConcurrentObjectPool<>();

void parse(String input) {
    NonThreadSafeParser parser = PARSER_POOL.borrow();
    try {
        parser.parse(input);
    } finally {
        PARSER_POOL.release(parser);
    }
}

或者你想提供的其他方法?

重要的因素是:

  • 性能
  • 内存使用
  • 垃圾收集

通常,每个方法的ProsCons是什么?

他们之间有什么明显的区别吗?

谢谢。

编辑

并发对象池克里奥使用的一个例子。

EN

回答 3

Stack Overflow用户

发布于 2016-01-25 12:08:00

当然,最明显的区别是,每个线程都有一个对象池或一个专用对象。这会带来各种后果,例如ThreadLocals可以完全有状态,因为它们只被单个线程使用。池对象可以是有状态的,但只有在线程签出时才有状态。

有些人认为ThreadLocals是邪恶的,即使他们不是,他们仍然要求你是一个聪明的曲奇在使用它们。对象池的缺陷和优势在很大程度上取决于存储在其中的实际对象。

因此,最后,它取决于和它有一定的意见基础。再一次,我们有一个软件开发问题,这个问题没有一个绝对的答案,尽管人们喜欢认为我们正在处理的是一门精确的科学。

票数 5
EN

Stack Overflow用户

发布于 2016-01-25 11:51:26

总的来说,我会用

ThreadLocal --如果该对象只属于该线程,但不能是私有的,则需要跨层访问。它可以是与当前线程相关的上下文。

ThreadPool -当我需要共享有限的资源或需要同步多个线程之间的通信时。

票数 1
EN

Stack Overflow用户

发布于 2017-08-08 13:24:30

一个粗略的经验法则可能是每个线程在这些对象上的租约的“长度”。如果线程应该在活动运行的整个过程中(接近)保持这些对象,那么ThreadLocal<>可能是最好的选择。另一方面,如果与整个线程的生存期相比,这些对象仅被短暂地或间歇地使用,那么对象池可能是可行的。

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

https://stackoverflow.com/questions/34990264

复制
相关文章

相似问题

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