关于 java.lang.ThreadLocal 类的 javadoc 让我感到困惑。他们说每个访问线程局部变量的线程都有自己的,独立初始化的变量副本。这是一个示例(不是真实的示例),它证明了线程局部变量中保存的变量可以被许多线程共享:
package com.mohamad.test.threadlocal;
import java.util.List;
public class ThreadLocalExample {
private static final ThreadLocal<List<Integer>> myThreadLocal = new ThreadLocal<List<Integer>>();
public static List<Integer> get() {
return (myThreadLocal.get());
}
public static void set(List<Integer> value) {
myThreadLocal.set(value);
}
}
package com.mohamad.test.threadlocal;
import java.util.ArrayList;
import java.util.List;
public class TestThreadLocal implements Runnable {
private static List<Integer> MY_TEST_LIST = new ArrayList<Integer>(){
/** The serialVersionUID */
private static final long serialVersionUID = -2419885728976816054L;
{add(1);}
};
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
ThreadLocalExample.set(MY_TEST_LIST);
List<Integer> integers = ThreadLocalExample.get();
integers.remove(0);
System.out.println(Thread.currentThread().getName() + " finished successfully, The list's size is: " + ThreadLocalExample.get().size() + "\n");
}
/**
* @param args
*/
public static void main(String[] args) {
TestThreadLocal thread1 = new TestThreadLocal();
Thread t1 = new Thread(thread1);
t1.start();
TestThreadLocal thread2 = new TestThreadLocal();
Thread t2 = new Thread(thread2);
t2.start();
}
}
如果我们运行这个例子, ajava.lang.IndexOutOfBoundsException
将被抛出,因为和MY_TEST_LIST
共享。(正如我们所见,当 thread1 和 thread2 调用 的方法,即调用变量的 set 方法时,它并没有创建 的独立本地副本)thread1
thread2
set(MY_TEST_LIST)
ThreadLocalExample
ThreadLocal
MY_TEST_LIST
如果有人已经问过这个问题,请给出答案的链接,因为我在 google 上进行研究时没有发现任何有趣的东西。
问候,