例如,我们有一个静态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); }
解决方法
这是安全的,因为getMap返回给定(即当前)线程的映射.没有其他线程可以搞乱这一点.所以它实际上取决于getMap的实现,以确保任何线程都可以 – 并且据我所知,它只是委托给Thread对象中的一个字段.我不清楚getMap是否曾经传递过当前线程以外的任何线程 – 如果是,那可能是有点棘手的 – 但我怀疑它们都是经过仔细编写以确保不是问题:)