Java-ThreadLocal还是并发对象池?

Java-ThreadLocal还是并发对象池?,java,performance,concurrency,thread-local,object-pooling,Java,Performance,Concurrency,Thread Local,Object Pooling,访问非线程安全对象时,哪种方法更容易接受 使用ThreadLocal对象: static final ThreadLocal<NonThreadSafeParser> PARSER_THREAD_LOCAL = new ThreadLocal<NonThreadSafeParser>() { @Override protected NonThreadSafeParser initialValue() { return new NonThre

访问非线程安全对象时,哪种方法更容易接受

使用
ThreadLocal
对象:

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);
}
static final ThreadLocal解析器\u THREAD\u LOCAL=new ThreadLocal(){
@凌驾
受保护的非线程安全分析器初始值(){
返回新的非线程safeparser();
}
};
无效解析(字符串输入){
PARSER_THREAD_LOCAL.get().parse(输入);
}
使用并发对象池:

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);
    }
}
静态最终ConcurrentObjectPool解析器_POOL=new ConcurrentObjectPool();
无效解析(字符串输入){
NonThreadSafeParser parser=parser_POOL.brook();
试一试{
parser.parse(输入);
}最后{
解析器_POOL.release(解析器);
}
}
或者你想提供的其他方法

重要因素包括:

  • 演出
  • 内存使用
  • 垃圾收集
一般来说,每种方法的优点和缺点是什么

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

谢谢

编辑

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);
    }
}

例如。

通常,我会使用

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


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

明显的区别当然是,您有一个对象池,或者每个线程有一个专用对象。这会产生各种后果,例如
ThreadLocals
可以是完全有状态的,因为它们仅由单个线程使用。池对象可以是有状态的,但只能在线程签出它们的期间

即使它们不是,它们仍然要求你在使用它们时要聪明。对象池的缺陷和优势在很大程度上取决于存储在其中的实际对象


因此,总而言之:这要视情况而定,而且在某种程度上是基于观点的。我们再一次遇到了一个软件开发问题,这个问题没有绝对的答案,尽管人们喜欢认为我们在处理的是一门精确的科学。

一个粗略的经验法则可能是每个线程在这些对象上通常有“多长”的租约。如果线程在其活动运行的整个时间内(接近)都应该保持这些对象,那么ThreadLocal可能是一个不错的选择。另一方面,如果与整个线程的生命周期相比,这些对象仅被短暂或间歇地使用,那么对象池可能是一种方法。

闻起来像是家庭作业/工作面试@ParkerHalo如果是呢?对我来说,这似乎是一个合理的问题me@AlexanderDerck实际上不是。在我的书中,“你更喜欢哪种方法”立即使它有资格以“主要基于观点”结尾。虽然这个问题本身是无害的,但它的“家庭作业”方式破坏了一个好问题。@Kayaman实际上是这样。这个问题的目的不是为了任何“工作面试”或“家庭作业”之类的事情。。。事实上,在我当前的项目中,我可以同时使用这两个选项,但我想选择最好的一个。@biziclop您可以编写自己的
ConcurrentObjectPool
:)