答案 0 :(得分:2)
我正在调查ThreadLocal initialValue()上的synchronized的相同用法。 Fakrudeen的答案包括一个Java 1.5缺陷的链接,其中synchronized关键字是为正在创建的多个对象解决的问题。它已在Java 1.6中修复
如果您在Java 1.5中运行此测试(取自Fakrudeen的链接)并将结果与更高版本进行比较,您将看到在版本1.6及更高版本中,不需要同步。
----------开始源---------- 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答案的评论,但我没有足够的分数:-))
答案 1 :(得分:1)
由于这个错误,它可能很有用:
答案 2 :(得分:0)
不,这完全没有意义,很可能是由一个不知道自己在做什么的人写的。