【发布时间】:2024-04-30 02:25:01
【问题描述】:
哪种方法更适合访问非线程安全对象?
使用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);
}
}
或您想提供的其他方法?
重要的因素是:
- 性能
- 内存使用情况
- 垃圾回收
一般来说,每种方法的优点和缺点是什么?
它们之间有什么明显的区别吗?
谢谢。
编辑:
Kryo 使用的Concurrent Object Pools 示例。
【问题讨论】:
-
闻起来像家庭作业/求职面试!
-
@ParkerHalo 如果是这样呢?对我来说似乎是一个有效的问题
-
@AlexanderDerck 实际上不是。 “您喜欢哪种方法”立即使其有资格以我书中的“主要基于意见”结束。虽然问题本身是无害的,但“家庭作业”的方式却破坏了一个好问题。
-
@Kayaman 实际上是这样。这个问题的目的不是为了任何“求职面试”或“家庭作业!”或诸如此类的事情...实际上,在我当前的项目中,有一种情况我可以同时使用这两个选项,但我想选择最好的一个。
-
@biziclop 你可以自己写
ConcurrentObjectPool:)
标签: java performance concurrency thread-local object-pooling