Я исследовал то же использование синхронизированных в ThreadLocal initialValue ().Ответ Факрудина включает ссылку на дефект Java 1.5, в котором синхронизированное ключевое слово было обходным путем для создания нескольких объектов.Это было исправлено в Java 1.6
Если вы запустите этот тест (взятый из ссылки Факрудина) в Java 1.5 и сравните свои результаты с более поздней версией, вы увидите, что в версиях 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;
}
}
}
---------- ИСТОЧНИК КОНЦА ----------
(я бы добавилэто как комментарий к ответу Факрудина, но мне не хватает очков :-))