哪种方法更适合访问非线程安全对象?
使用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 ConcurrentObjectPool<NonThreadSafeParser> PARSER_POOL = new ConcurrentObjectPool<>();
void parse(String input) {
NonThreadSafeParser parser = PARSER_POOL.borrow();
try {
parser.parse(input);
} finally {
PARSER_POOL.release(parser);
}
}或者你想提供的其他方法?
重要的因素是:
通常,每个方法的Pros和Cons是什么?
他们之间有什么明显的区别吗?
谢谢。
编辑:
发布于 2016-01-25 12:08:00
当然,最明显的区别是,每个线程都有一个对象池或一个专用对象。这会带来各种后果,例如ThreadLocals可以完全有状态,因为它们只被单个线程使用。池对象可以是有状态的,但只有在线程签出时才有状态。
有些人认为ThreadLocals是邪恶的,即使他们不是,他们仍然要求你是一个聪明的曲奇在使用它们。对象池的缺陷和优势在很大程度上取决于存储在其中的实际对象。
因此,最后,它取决于和它有一定的意见基础。再一次,我们有一个软件开发问题,这个问题没有一个绝对的答案,尽管人们喜欢认为我们正在处理的是一门精确的科学。
发布于 2016-01-25 11:51:26
总的来说,我会用
ThreadLocal --如果该对象只属于该线程,但不能是私有的,则需要跨层访问。它可以是与当前线程相关的上下文。
ThreadPool -当我需要共享有限的资源或需要同步多个线程之间的通信时。
发布于 2017-08-08 13:24:30
一个粗略的经验法则可能是每个线程在这些对象上的租约的“长度”。如果线程应该在活动运行的整个过程中(接近)保持这些对象,那么ThreadLocal<>可能是最好的选择。另一方面,如果与整个线程的生存期相比,这些对象仅被短暂地或间歇地使用,那么对象池可能是可行的。
https://stackoverflow.com/questions/34990264
复制相似问题