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

标签 java multithreading performance 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;
    }
}

currentTransactionContext 字段是 ThreadLocal 类型,它是类中唯一的字段。

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

这里需要同步吗?

最佳答案

一般来说,很难保证只给定一个程序的一小段线程安全,因为线程安全是整个程序的一个属性,synchronized可以协调跨程序许多不同部分的行为。

例如:也许其他地方有一些其他代码片段使用疯狂的不安全反射来尝试检查和/或改变 ThreadLocal 的内部结构,因此如果您在没有锁定的情况下改变 ThreadLocal 就会中断?

但实际上,您是完全正确的:没有任何理由在 ThreadLocal 实例上进行同步,除非在其 initialValue 方法内。 ThreadLocal 本身就是一种线程安全机制,它管理线程安全的方式比通过添加 synchronized 获得的更好。

(向 Margaret Bloom 致敬,指出 initialValue 案例。)

关于java - ThreadLocal 上的操作是否必须同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323629/

相关文章:

java - 在 Java 中,如何确定线程是否正在运行?

multithreading - 如何在不创建Windows句柄的情况下将消息传递到TApartmentThread实例

java - 为什么 Java 错误会被 ExecutorService 实例生成的线程吞噬?

java - 如何格式化导出 pdf 中的显示标签总值行?

java - 如何根据另一字段中的数据启用/禁用一个字段

java - Eclipse 插件 - TableViewer 是否适合需要多个表时

performance - int 与 float 的排序是否存在速度差异?

performance - 如何用记录集数据填充数组

python - 删除其中有 2 个连续元音的单词

java - 如何使用Java获取png文件中的文本