ThreadLocal変数を子スレッドに引き継がせる。などと文字どおりに捉えたら
ナンセンスなことを考えてた。
でも実際に必要に迫られる設計もありうる。
InheritableThreadLocal の存在に気がつけば良いのであろうが、
その前は、スレッド生成時、実行前に、ThreadLocal変数を引き継ぐような
クラスを考えてた。
→単純にコンストラクタを呼ばせてコンストラクタ内でThreadLocal変数を
get()で取得して スレッド開始(run())の先頭で、
ThreadLocal変数#set(value) を実行する。。。
という情けないことを考えてた。
ThreadLocal変数 インスタンス生成をInheritableThreadLocalで
作ればこんなことしなくて良い。
=== InheritableThreadLocal を使わない宣言 ===
public class ApplicationDefine {
private static ThreadLocal<String> _name;
private ApplicationDefine(){}
public final static void set(String name){
if (_name==null){
_name = new ThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return "unknown";
}
};
}
_name.set(name);
}
public final static String get(){
if (_name==null){
_name = new ThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return "unknown";
}
};
}
return _name.get();
}
}
=== InheritableThreadLocal を使う時 ===
public class ApplicationDefine {
private static ThreadLocal<String> _name;
private ApplicationDefine(){}
public final static void set(String name){
if (_name==null){
_name = new InheritableThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return "unknown";
}
};
}
_name.set(name);
}
public final static String get(){
if (_name==null){
_name = new InheritableThreadLocal<String>(){
@Override
protected synchronized String initialValue(){
return "unknown";
}
};
}
return _name.get();
}
}
でも、子スレッドが自動的に引き継がれるのが意識されないので、
スレッドローカル変数であるという設計意識がズレてくるのが
後で問題にならないだろうか?
悩まなくてはならない問題ではないかと思う。