關於類java.lang.ThreadLocal的javadoc讓我感到困惑。他們說每個訪問線程局部變量的線程都有自己的,獨立初始化的變量副本。 這裏是誰證明了在一個線程局部變量舉辦變量可以被多個線程共享一個例子(不是真正的生活中的例子):java.lang.ThreadLocal - 每個線程如何擁有自己獨立初始化的變量副本?
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();
}
}
如果我們運行這個爲例,一個java.lang.IndexOutOfBoundsException
將被拋出,因爲由thread1
和thread2
共享的MY_TEST_LIST
。 (正如我們所看到的,當線程1和線程叫ThreadLocalExample
的set(MY_TEST_LIST)
方法,即所謂的ThreadLocal
變量的設置方法,它沒有創造MY_TEST_LIST
的獨立本地副本)
如果有人已經問過這個問題,請給出答案的鏈接,因爲我在搜索google時沒有發現任何有趣的內容。
Regards,
''ThreadLocal''可以被看作是一個'Map ',帶有一些額外的方法來控制初始化。 –
OldCurmudgeon
2012-07-06 10:30:38