【发布时间】:2017-05-10 11:15:16
【问题描述】:
这是我偶然发现的代码:
class TransactionContextHolder {
private static final ThreadLocal<TransactionContext> currentTransactionContext = new NamedInheritableThreadLocal<TransactionContext>(
"Test Transaction Context");
static TransactionContext getCurrentTransactionContext() {
return currentTransactionContext.get();
}
static void setCurrentTransactionContext(TransactionContext transactionContext) {
currentTransactionContext.set(transactionContext);
}
static TransactionContext removeCurrentTransactionContext() {
synchronized (currentTransactionContext) {
TransactionContext transactionContext = currentTransactionContext.get();
currentTransactionContext.remove();
return transactionContext;
}
}
}
currentTransactionContext 字段是 ThreadLocal 类型,它是类中唯一的字段。
在我看来,这里不需要同步,因为存储在 ThreadLocal 中的值与特定线程相关联,因此它不是共享状态。此外,我认为它会影响性能,因为 currentTransactionContext 本身是共享的,并且只允许一个线程进入块,而许多线程可以并行执行而不影响正确性。
这里需要同步吗?
【问题讨论】:
-
只要确保
currentTransactionContext.initialValue(甚至是getter)没有共享状态,然后你就可以删除同步了。
标签: java multithreading performance synchronized thread-local