java必须同步ThreadLocal上的操作吗?
以下是我偶然发现的代码:
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本身是共享的,只允许一个线程进入块,而许多线程可以并行执行,而不会影响正确性
这里需要同步吗
# 1 楼答案
一般来说,仅给出程序的一小部分就很难保证线程安全性,因为线程安全性是整个程序的一个属性,并且
synchronized
可以跨程序的许多不同部分协调行为例如:可能在其他地方还有其他一些代码使用疯狂的不安全反射来尝试检查和/或变异ThreadLocal的内部,如果您在不锁定的情况下变异ThreadLocal,那么它将因此中断
但实际上,您是完全正确的:除了在ThreadLocal实例的
initialValue
方法中之外,没有任何理由在ThreadLocal实例上进行同步。ThreadLocal本身就是一种线程安全机制,它管理其线程安全性的效果要比您在synchronized
上加钉要好(帽子尖指向Margaret Bloom指出
initialValue
案例。)