ThreadLocalの get() メソッドと initialValue() メソッドが同期されているコードを見つけました。
これらのメソッドを同期させる用途が見つかりませんでした。私が間違っている場合は修正してください。
-クリシュナ。
ThreadLocalの get() メソッドと initialValue() メソッドが同期されているコードを見つけました。
これらのメソッドを同期させる用途が見つかりませんでした。私が間違っている場合は修正してください。
-クリシュナ。
ThreadLocal initialValue() での同期の同じ使用法を調査していました。Fakrudeen の回答には、Java 1.5 の欠陥へのリンクが含まれており、この中では Synchronized キーワードが複数のオブジェクトが作成された場合の回避策でした。Java 1.6 で修正されました。
このテスト (Fakrudeen のリンクから取得) を Java 1.5 で実行し、結果を新しいバージョンと比較すると、バージョン 1.6 以降では同期が不要であることがわかります。
---------- BEGIN SOURCE ---------- import java.util.ArrayList;
public class ThreadLocalBug { static int COUNT = 8;
static ThreadLocal tl = new ThreadLocal() {
protected Object initialValue() {
System.err.println("initialValue called");
ArrayList list = new ArrayList(COUNT);
for (int i = 0; i < COUNT; i++) {
MyThreadLocal mtl = new MyThreadLocal();
mtl.get();
list.add(mtl);
}
return list;
}
};
public static void main(String[] args) throws Throwable {
Object first = tl.get();
Object second = tl.get();
Object third = tl.get();
System.err.println("first=" + first);
System.err.println("second=" + second);
System.err.println("second=" + third);
}
static class MyThreadLocal extends ThreadLocal {
protected Object initialValue() {
return Boolean.TRUE;
}
}
}
---------- エンドソース ----------
(これをFakrudeenの回答へのコメントとして追加したはずですが、十分なポイントがありません:-))
このバグが原因で役立つ場合があります。
いいえ、それはまったく無意味であり、自分が何をしているのかを知らない誰かによって書かれた可能性があります。