Javaマルチスレッド――ThreadLocal
7457 ワード
複数のスレッド間でリソースを共有する必要がある場合、スレッド間の通信は同期機構を使用することができる。複数のスレッド間の共有衝突を分離する必要がある場合、ThreadLocalを使用することができます。
public class ThreadLocal
extens Object
ThreadLocal類はスレッドローカル変数を提供します。ある変数(そのgetまたはset方法によって)にアクセスするスレッドごとに独自のローカル変数があります。ThreadLocalの例は、通常、クラス内のprvate staticフィールドであり、状態をあるスレッド(例えば、ユーザIDまたはトランザクションID)に関連付けることを望む。
スレッドAが取得したシリアル番号は1です。
スレッドAがシリアル番号を3に変更しました。
スレッドAが再度取得したシリアルナンバーは3です。
スレッドBが取得したシリアル番号は2です。
スレッドBがシリアル番号を6に変更しました。
スレッドBが再度取得したシリアル番号は6です。
スレッドCが取得したシリアル番号は3です。
スレッドCはシリアル番号を9に変更しました。
スレッドCが再度取得したシリアルナンバーは9です。
上記の例から、スレッドごとに独自のThreadLocal変数があり、それらの値が互いに干渉しないことが分かります。これがThreadLocalの用途です。
public class ThreadLocal
extens Object
ThreadLocal類はスレッドローカル変数を提供します。ある変数(そのgetまたはset方法によって)にアクセスするスレッドごとに独自のローカル変数があります。ThreadLocalの例は、通常、クラス内のprvate staticフィールドであり、状態をあるスレッド(例えば、ユーザIDまたはトランザクションID)に関連付けることを望む。
- package example.thread.threadLocal;
-
- public class SerialNum {
-
- private static int nextSerialNum = 1;
-
- private static ThreadLocal<Integer> serialNum = new ThreadLocal<Integer>() {
- protected Integer initialValue() {
- return new Integer(nextSerialNum++);
- }
- };
-
- public static int get() {
- return ((Integer) (serialNum.get())).intValue();
- }
-
-
- public static void set(Integer newSerial){
- serialNum.set(newSerial);
- }
- }
- package example.thread.threadLocal;
-
- public class GetSerialNumThread implements Runnable {
-
- public static void main(String args[]) {
-
- GetSerialNumThread serialNumGetter = new GetSerialNumThread();
- Thread t1 = new Thread(serialNumGetter, " A");
- Thread t2 = new Thread(serialNumGetter, " B");
- Thread t3 = new Thread(serialNumGetter, " C");
- t1.start();
- try {
- t1.join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- t2.start();
- t3.start();
- }
-
- public void run() {
- int mySerialNum = getSerialNum();
- System.out.println(Thread.currentThread().getName()
- + " " + mySerialNum);
- System.out.println(Thread.currentThread().getName()
- + " " + (mySerialNum * 3));
- setSerialNum(mySerialNum * 3);
- System.out.println(Thread.currentThread().getName()
- + " " + getSerialNum());
- }
-
- private int getSerialNum() {
- return SerialNum.get();
- }
-
- private void setSerialNum(int newSerialNum) {
- SerialNum.set(new Integer(newSerialNum));
- }
- }
結果:スレッドAが取得したシリアル番号は1です。
スレッドAがシリアル番号を3に変更しました。
スレッドAが再度取得したシリアルナンバーは3です。
スレッドBが取得したシリアル番号は2です。
スレッドBがシリアル番号を6に変更しました。
スレッドBが再度取得したシリアル番号は6です。
スレッドCが取得したシリアル番号は3です。
スレッドCはシリアル番号を9に変更しました。
スレッドCが再度取得したシリアルナンバーは9です。
上記の例から、スレッドごとに独自のThreadLocal変数があり、それらの値が互いに干渉しないことが分かります。これがThreadLocalの用途です。