スレッドローカルストレージ-threadLocal

2473 ワード

スレッドローカルストレージ(スレッドローカル変数)は、同じ変数の異なるスレッドごとに異なるストレージを作成します.したがって、5つのスレッドが同じ変数Vで表されるオブジェクトを使用している場合、スレッドローカルストレージは、ステータスをスレッドに関連付けることができる5つのV用の異なるストレージブロックを生成します.ソースコードを表示すると、その内部実装はThrealLocalMapと呼ばれ、各スレッドにはThreadLocalMapがあり、各スレッドのThreadLocalMapオブジェクトは、各スレッドの実行時のスレッドローカル変数値を保存するために使用できることがわかります.【サンプルコード】
package test.demo.threadlocal;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadLocalHolder {
	private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
		private Random rand = new Random(47);

		protected synchronized Integer initialValue() {
			return rand.nextInt(10000);
		}
	};

	public static void increment() {
		value.set(value.get() + 1);
	}

	public static int get() {
		return value.get();
	}

	public static void main(String[] args) throws InterruptedException {
		System.out.println("*****************************************");
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < 3; i++) {
			exec.execute(new Accessor(i));
		}
		TimeUnit.MILLISECONDS.sleep(50);
		exec.shutdownNow();
	}
}

  
package test.demo.threadlocal;

public class Accessor implements Runnable {
	private final int id;

	public Accessor(int id) {
		this.id = id;
	}

	@Override
	public void run() {
		while (!Thread.currentThread().isInterrupted()) {
			ThreadLocalHolder.increment();
			System.out.println(this);
			Thread.yield();
		}
	}

	public String toString() {
		return "#Thread[" + id + "] [ThreadLocal] value:" + ThreadLocalHolder.get();
	}
}

 
【出力結果】
*****************************************
#Thread[0] [ThreadLocal] value:9259
#Thread[0] [ThreadLocal] value:9260
#Thread[0] [ThreadLocal] value:9261
#Thread[2] [ThreadLocal] value:556
#Thread[0] [ThreadLocal] value:9262
#Thread[2] [ThreadLocal] value:557
#Thread[0] [ThreadLocal] value:9263
#Thread[2] [ThreadLocal] value:558
#Thread[0] [ThreadLocal] value:9264