ThreadLocal上的操作是否必须同步?

use*_*558 7 java performance multithreading synchronized thread-local

这是我偶然发现的代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

所述currentTransactionContext字段是类型的ThreadLocal的,它是在该类中唯一的字段.

在我看来,这里不需要同步,因为存储在ThreadLocal中的值与特定线程相关联,因此它不是共享状态.另外我认为它会影响性能,因为currentTransactionContext本身是共享的,只允许一个线程进入块,而许多线程可以并行执行而不影响正确性.

这里需要同步吗?

rua*_*akh 7

一般来说,由于线程安全性是整个程序的一个属性,并且可以协调程序的许多不同部分的行为,因此很难仅仅通过一小部分程序来保证线程安全性synchronized.

例如:也许在其他地方有一些其他的代码片段使用疯狂的不安全反射来尝试检查和/或改变ThreadLocal的内容,如果你在没有锁定的情况下改变ThreadLocal那么会破坏它?

但实际上,你是对的:除了可能在其initialValue方法内部之外,从来没有任何理由在ThreadLocal实例上进行同步.ThreadLocal本身就是一个线程安全机制,它可以更好地管理其线程安全性synchronized.

(向玛格丽特布鲁姆提示,指出initialValue案件.)