ThreadLocal线程安全吗?

时间:2014-11-28 12:05:05

标签: java multithreading thread-safety

例如,我们有一个静态ThreadLocal字段和一个setter:

private static final ThreadLocal threadLocalField = new ThreadLocal;

public static void getSXTransaction() {
  threadLocalField.set(new MyValue());
}

我想知道,由于 java.lang.ThreadLocal #set 方法中没有隐式同步,因此线程安全的保证是什么? 我知道TreadLocal类本质上是完全线程安全的,但我无法理解它是如何完成的。

以下是它的源代码:

/**
 * Sets the current thread's copy of this thread-local variable
 * to the specified value.  Most subclasses will have no need to 
 * override this method, relying solely on the {@link #initialValue}
 * method to set the values of thread-locals.
 *
 * @param value the value to be stored in the current thread's copy of
 *        this thread-local.
 */
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

1 个答案:

答案 0 :(得分:15)

它是安全的,因为getMap返回给定(即当前)线程的映射。没有其他线程可以搞乱这一点。因此,getMap的实施确实可以确保 对任何线程都可以 - 而且据我所知,这只是委托给Thread对象中的字段。我不清楚getMap是否传递任何线程其他而不是当前线程 - 如果是,那可能有点棘手 - 但我怀疑它是&#39 ;所有这些都是经过精心编写的,以确保这不是问题:)