2009年12月3日木曜日

ThreadPoolとThreadLocalを併用する際の注意

ThreadLocalは便利だけど実は落とし穴ががが

TomcatなどのThreadPoolを使用する場合、同一のThreadが使いまわされるため、
ThreadLocalの値も引き継がれてしまうという現象が起き、それがもとでエラーが発生することが。。。

以下その検証コード

public static void main(String[] args){

System.out.println("hoge");


threadLocal = new ThreadLocal();
executor = java.util.concurrent.Executors.newFixedThreadPool(3);
for(int i = 0;i < 10;i++)
{
executor.execute(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String value = threadLocal.get();
if(value == null){
value = new Random().nextInt() + "";
threadLocal.set(value);
}

System.out.println(value);

}
});


}

}
}





結果として、全て違う値が表示されることが期待されるが、
実際は同じ値がなんども表示される。
そのため、Threadの終了時に

ThreadLocal.remove();

を明示的に呼び出すようにしてやることをお勧めします。

0 件のコメント:

コメントを投稿