最佳答案
我正在研究 ThreadLocalinitialValue() 上同步的相同用法。 Fakrudeen 的答案包括一个 Java 1.5 缺陷的链接,其中同步关键字是创建多个对象的解决方法。它已在 Java 1.6 中修复
如果您在 Java 1.5 中运行此测试(取自 Fakrudeen 的链接)并将结果与更高版本进行比较,您将发现在 1.6 及更高版本中不需要同步。
---------- 开始源 ---------- 导入java.util.ArrayList;
公共(public)类ThreadLocalBug { 静态 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 答案的评论,但我没有足够的积分:-) )
关于java - ThreadLocal的synchronized的get和initialValues方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553531/