「Java」ThreadLocal のサンプル

ThreadLocal クラス使ったサンプル書いてみたのでメモ。

ただ、僕レベルではどういう場面で使うのか想像するのが難しい感じでした。
API ドキュメント見てもちょっとわからずで・・・

・ThreadLocal (Java Platform SE 7 )
http://docs.oracle.com/javase/jp/7/api/java/lang/ThreadLocal.html

ちなみに、以下の書籍では、こんなことが書かれてました ( 言ってることはわかりますが・・・ )。

プログラミング言語Java (The Java Series)

----- 書籍から抜粋 ここから -----
ThreadLocal クラスにより、別々のスレッドで独立した値を持つ、1 つの論理的変数を持つことが可能になります。
----- 書籍から抜粋 ここまで -----

こんな状態なのですが、せっかく調べてサンプル書いたので、メモだけしておきます ( ちゃんと理解して適切に使える日が来ますように! )。

■ Test.java

package test;

public class Test {

	public static void main(String[] args) {
		Thread t1 = new MyThread();
		Thread t2 = new MyThread();
		t1.start();
		t2.start();
	}
}

class MyThread extends Thread {
	private static ThreadLocal<ClassA> tl = new ThreadLocal<ClassA>() {
		protected ClassA initialValue() {
			return new ClassA();
		}
	};

	public void run() {
		System.out.println(getName() + ":" + tl.get().increase());
	}
}

class ClassA {
	int i = 0;

	public int increase() {
		return ++i;
	}
}

■ 実行結果

Thread-0:1
Thread-1:1

スレッド毎に別々の ClassA インスタンスが保持できていますね。

以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 7 Update 45


■ 備考
今回みたいなサンプルであれば「ClassA ca = new ClassA();」でええやんって感じか・・・