Se eu tiver um código (guardanapo) parecido com este:
public static SomeClass someInstance;
ThreadLocal<HashMap<Integer, SomeClass>> locals = new ThreadLocal<>(){
@Override protected HashMap<Integer, SomeClass> initialValue() {
return new HashMap<Integer,SomeClass>(){{put(5,someInstance);}};
}
}
O que ele realmente faz? Se a thread1 alterar alguma Classe acessando-a por meio de seu hashmap threadlocal, essas alterações serão visíveis para a thread2 (eventualmente)?
Para o meu uso, está tudo bem se houver uma condição de corrida entre o momento em que os dados são gravados em someClass e o momento em que outro thread observa a alteração, mas não estará tudo bem se o thread leitor nunca vir a alteração, mesmo depois de muito tempo.
Sua preocupação não está especificamente relacionada ao uso de
ThreadLocal
; os problemas que você prevê também ocorrerão se você compartilhar um objeto mutável com vários threads por outros meios e modificar esse objeto.Para que as alterações sejam garantidas como visíveis (eventualmente ou não), você precisa implementar
SomeClass
a segurança de thread adequada; caso contrário, não há garantia de que essas alterações serão vistas ou não por outras threads. E para ser seguro para threads, conforme definido no Modelo de Memória Java (JMM), você precisa usar primitivas de sincronização, bloqueios e outros mecanismos de publicação que estabeleçam um "acontece antes" entre a gravação de uma thread e a leitura subsequente de outra thread (e também com gravações realizadas por outras threads).