今日も元気にThreadLocal 2013/05/23

Javaです。
ThreadLocalです。使ったことなかったんですよね。ThreadLocal。なので、動きがいまいちわからなかったんですけど、コードを書くとイメージわきますね。

getの実装が内部ではカレントスレッドのmapから値をとるようになってます。なので、スレッドごとに値が保存できるようになってました。Threadがなくなると値がGCされるようですね。

public class TestThreadLocal { public static void main(String[] args) { a(); } static void a() { final ThreadLocal<String> threadLocal = new ThreadLocal<String>(); threadLocal.set(Thread.currentThread().getName()); Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("この値はnull = " + threadLocal.get()); threadLocal.set("thread1"); System.out.println("この値はthread1 = " + threadLocal.get()); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { System.out.println("この値はnull = " + threadLocal.get()); threadLocal.set("thread2"); System.out.println("この値はthread2 = " + threadLocal.get()); } }); thread1.start(); thread2.start(); System.out.println("この値は" + Thread.currentThread().getName() + "=" + threadLocal.get()); } }

実行の結果、スレッドなので、毎回、順序がかわりますが下の感じ。
この値はnull = null この値はthread1 = thread1 この値はmain=main この値はnull = null この値はthread2 = thread2

: