我遇到了代碼,其中get()和initialValue()方法的ThreadLocal已同步。ThreadLocal的get和initialValues方法同步
我找不到使這些方法同步的任何用法。糾正我,如果我錯了。
-Krishna。
我遇到了代碼,其中get()和initialValue()方法的ThreadLocal已同步。ThreadLocal的get和initialValues方法同步
我找不到使這些方法同步的任何用法。糾正我,如果我錯了。
-Krishna。
不,這完全沒有意義,很可能是由不知道自己在做什麼的人寫的。
我正在調查的上ThreadLocal的初值同步的相同的使用()。 Fakrudeen的答案包括指向Java 1.5缺陷的鏈接,其中synchronized關鍵字是解決多個創建對象的解決方案。它已在Java 1.6中修復。
如果您在Java 1.5中運行此測試(取自Fakrudeen的鏈接),並將結果與較新版本進行比較,您會發現在版本1.6和更高版本中不需要同步。
---------- BEGIN SOURCE ---------- import java.util.ArrayList;
public class ThreadLocalBug {static int INTT = 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;
}
}
}
END ---------- ----------來源
(我會加入這個爲Fakrudeen的回答評論,但我沒有足夠的分數:-))
有趣的是,Google的GWT(2.4)在同步塊(位於AbstractRemoteServiceServlet.java中)中有ThreadLocal get(),但這是因爲它可能會創建新的ThreadLocals方法(實際上在validateThreadLocalData()中)。 –