0

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

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

-克里希纳。

4

3 回答 3

2

我正在研究 ThreadLocal initialValue() 上同步的相同用法。Fakrudeen 的回答包括一个指向 Java 1.5 缺陷的链接,其中 synchronized 关键字是正在创建的多个对象的变通方法。它已在 Java 1.6 中修复

如果您在 Java 1.5 中运行此测试(取自 Fakrudeen 的链接)并将结果与​​更高版本进行比较,您会发现在 1.6 及更高版本中不需要同步。

---------- BEGIN SOURCE ---------- 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 答案的评论,但我没有足够的积分:-))

于 2015-10-16T12:26:12.023 回答
1

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

https://bugs.openjdk.java.net/browse/JDK-6550283?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab

于 2014-04-17T20:54:28.813 回答
0

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

于 2011-11-19T23:48:45.843 回答