我遇到了代码,其中get()和initialValue()方法的ThreadLocal已同步。ThreadLocal的get和initialValues方法同步
我找不到使这些方法同步的任何用法。纠正我,如果我错了。
-Krishna。
我遇到了代码,其中get()和initialValue()方法的ThreadLocal已同步。ThreadLocal的get和initialValues方法同步
我找不到使这些方法同步的任何用法。纠正我,如果我错了。
-Krishna。
不,这完全没有意义,很可能是由不知道自己在做什么的人写的。
我正在调查的上ThreadLocal的初值同步的相同的使用()。 Fakrudeen的答案包括指向Java 1.5缺陷的链接,其中synchronized关键字是解决多个创建对象的解决方案。它已在Java 1.6中修复。
如果您在Java 1.5中运行此测试(取自Fakrudeen的链接),并将结果与较新版本进行比较,您会发现在版本1.6和更高版本中不需要同步。
---------- BEGIN SOURCE ---------- import java.util.ArrayList;
public class ThreadLocalBug {static int INTT = 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;
}
}
}
END ---------- ----------来源
(我会加入这个为Fakrudeen的回答评论,但我没有足够的分数:-))
有趣的是,Google的GWT(2.4)在同步块(位于AbstractRemoteServiceServlet.java中)中有ThreadLocal get(),但这是因为它可能会创建新的ThreadLocals方法(实际上在validateThreadLocalData()中)。 –