Java ThreadLocal synchronized的get和initialValues方法
我遇到了一段代码,其中的get()和initialValue()方法是同步的 我找不到同步这些方法的任何用处。如果我错了,请纠正我Java ThreadLocal synchronized的get和initialValues方法,java,synchronization,thread-local,Java,Synchronization,Thread Local,我遇到了一段代码,其中的get()和initialValue()方法是同步的 我找不到同步这些方法的任何用处。如果我错了,请纠正我 -奎师那。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。由于这个错误,它可能是有用的: 由于此错误,它可能很有用: 我正在调查ThreadLocal initialValue()上同步的相同用法。Fakrudeen的答案包括一个指向Java1.5缺陷的链接,其中synchronized关键字是正在
-奎师那。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。由于这个错误,它可能是有用的:
由于此错误,它可能很有用:
我正在调查ThreadLocal initialValue()上同步的相同用法。Fakrudeen的答案包括一个指向Java1.5缺陷的链接,其中synchronized关键字是正在创建的多个对象的解决方法。它是在Java1.6中修复的 如果您在Java1.5中运行此测试(取自Fakrudeen的链接),并将结果与更高版本进行比较,您将看到在1.6和更高版本中,不需要同步 ----------起始源---------- 导入java.util.ArrayList 公共类ThreadLocalBug{ 静态整数计数=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;
}
}
static ThreadLocal tl=new ThreadLocal(){
受保护对象初始值(){
System.err.println(“调用的初始值”);
ArrayList=新的ArrayList(计数);
for(int i=0;i
}
----------端源----------
(我本想在Fakrudeen的回答中添加这一点作为评论,但我没有足够的观点:-)我正在调查ThreadLocal initialValue()上同步的相同用法。Fakrudeen的答案包括一个指向Java1.5缺陷的链接,其中synchronized关键字是正在创建的多个对象的解决方法。它是在Java1.6中修复的 如果您在Java1.5中运行此测试(取自Fakrudeen的链接),并将结果与更高版本进行比较,您将看到在1.6和更高版本中,不需要同步 ----------起始源---------- 导入java.util.ArrayList 公共类ThreadLocalBug{ 静态整数计数=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;
}
}
static ThreadLocal tl=new ThreadLocal(){
受保护对象初始值(){
System.err.println(“调用的初始值”);
ArrayList=新的ArrayList(计数);
for(int i=0;i
}
----------端源----------
(我本想在Fakrudeen的回答中添加这一点作为评论,但我没有足够的观点:-)有趣的是,Google的GWT(2.4)在一个同步块中(在AbstractRemoteServiceServlet.java中)有它的ThreadLocal get(),但这是因为它可能在该方法中创建新的ThreadLocal(实际上是在validateThreadLocalData()中)。有趣的是,Google的GWT(2.4)在一个同步块(在AbstractRemoteServiceServlet.java中)中有它的ThreadLocal get(),但这是因为它可能在该方法中创建新的ThreadLocal(实际上在validateThreadLocalData()中)。