Java ThreadLocal synchronized的get和initialValues方法

Java ThreadLocal synchronized的get和initialValues方法,java,synchronization,thread-local,Java,Synchronization,Thread Local,我遇到了一段代码,其中的get()和initialValue()方法是同步的 我找不到同步这些方法的任何用处。如果我错了,请纠正我 -奎师那。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。不,那完全没有意义,很可能是由不知道自己在做什么的人写的。由于这个错误,它可能是有用的: 由于此错误,它可能很有用: 我正在调查ThreadLocal initialValue()上同步的相同用法。Fakrudeen的答案包括一个指向Java1.5缺陷的链接,其中synchronized关键字是正在

我遇到了一段代码,其中的get()和initialValue()方法是同步的

我找不到同步这些方法的任何用处。如果我错了,请纠正我


-奎师那。

不,那完全没有意义,很可能是由不知道自己在做什么的人写的。

不,那完全没有意义,很可能是由不知道自己在做什么的人写的。

由于这个错误,它可能是有用的:


由于此错误,它可能很有用:


我正在调查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()中)。