クラス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();
}
}
この例を実行すると、とによって共有されているjava.lang.IndexOutOfBoundsException
ため、がスローされます。(そして、私たちが見たように、thread1とthread2が変数のsetメソッドを呼び出したのメソッドを呼び出したとき、それはの独立したローカルコピーを作成しませんでした)MY_TEST_LIST
thread1
thread2
set(MY_TEST_LIST)
ThreadLocalExample
ThreadLocal
MY_TEST_LIST
誰かがすでにこの質問をしている場合は、グーグルで調査しているときに面白いものが見つからなかったので、答えへのリンクを教えてください。
よろしく、