Как указывало большинство, вы глубоко неправильно поняли ThreadLocal.Вот как я бы написал, чтобы быть более точным.
public class MyMainClass {
private static final ThreadLocal<MyClass> local = new ThreadLocal<>(){
public MyClass initialValue(){
return new MyClass();
}
}
public static void main(String[] args) throws InterruptedException {
local.set(new MyClass());
for(int i=0;i<5; i++){
Thread thread = new Thread(new Runnable(){
public void run(){
local.get().printNameTillFlagIsSet();
local.get().run();
local.get().printNameTillFlagIsSet();
}
});
thread.start();
}
}
}
Итак, здесь создано пять разных экземпляров MyClass.Каждый поток будет иметь свою собственную доступную копию каждого MyClass.То есть, поток, созданный при i = 0, всегда будет иметь другой экземпляр MyClass, чем i = 1,2,3,4, несмотря на то, сколько сделано local.get ().
Внутренняя работа немного сложнеено это можно сделать аналогично
ConcurrentMap<Long,Thread> threadLocalMap =...;
public MyClass get(){
long id = Thread.currentThread().getId();
MyClass value = threadLocalMap.get(id);
if(value == null){
value = initialValue();
threadLocalMap.put(id,value);
}
return value;
}
Для дальнейшего ответа на ваш вопрос о летучем поле.Это по сути бесполезно здесь.Поскольку само поле является «локальным для потока», проблем с упорядочением и памятью не будет.