我遇到了一个代码,其中ThreadLocal的 get() 和 initialValue() 方法是同步的。
我找不到让这些方法同步的任何用处。如果我错了,请纠正我。
-克里希纳。
我正在研究 ThreadLocal initialValue() 上同步的相同用法。Fakrudeen 的回答包括一个指向 Java 1.5 缺陷的链接,其中 synchronized 关键字是正在创建的多个对象的变通方法。它已在 Java 1.6 中修复
如果您在 Java 1.5 中运行此测试(取自 Fakrudeen 的链接)并将结果与更高版本进行比较,您会发现在 1.6 及更高版本中不需要同步。
---------- BEGIN SOURCE ---------- import java.util.ArrayList;
公共类 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 答案的评论,但我没有足够的积分:-))
由于此错误,它可能很有用:
不,这完全没有意义,而且很可能是由不知道自己在做什么的人写的。