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 件のコメント:
コメントを投稿