J'ai une implémentation de cache comme ceci:Synchronisation des structures imbriquées de données entre threads en Java
class X
{
private final Map<String, ConcurrentMap<String, String>> structure = new HashMap...();
public String getValue(String context, String id)
{
// just assume for this example that there will be always an innner map
final ConcurrentMap<String, String> innerStructure = structure.get(context);
String value = innerStructure.get(id);
if(value == null)
{
synchronized(structure)
{
// can I be sure, that this inner map will represent the last updated
// state from any thread?
value = innerStructure.get(id);
if(value == null)
{
value = getValueFromSomeSlowSource(id);
innerStructure.put(id, value);
}
}
}
return value;
}
}
Est-ce thread-safe mise en œuvre? Puis-je être sûr d'obtenir le dernier état mis à jour de n'importe quel thread à l'intérieur du bloc synchronisé? Est-ce que ce changement de comportement si j'utilise un java.util.concurrent.ReentrantLock au lieu d'un bloc synchronisé, comme ceci:
...
if(lock.tryLock(3, SECONDS))
{
try
{
value = innerStructure.get(id);
if(value == null)
{
value = getValueFromSomeSlowSource(id);
innerStructure.put(id, value);
}
}
finally
{
lock.unlock();
}
}
...
Je sais que les membres de dernière instance sont synchronisées entre les threads, mais est-ce vrai aussi pour les objets tenu par ces membres?
Peut-être que c'est une question stupide, mais je ne sais pas comment le tester pour être sûr que cela fonctionne sur tous les OS et toutes les architectures.
Merci pour votre allusion à la lecture non synchronisée, je vais mettre à jour ma question en conséquence. – Dominik