Bonjour,
Je suppose que c'est un grand classique, mais je ne sais plus exactement comment faire pour synchroniser efficacement mes threads. Bon, ça va peut-être ressembler à une question d'examen, mais si quelqu'un a une solution pour moi, elle est bien venue :-)
Pour faire simple, j'ai une HashMap statique dans une classe, une méthode init() qui réinitialise ma map, et une méthode getMap() qui me retourne son instance. Cette map n'est jamais modifiée a l'extérieur de ma classe.
Mon objectif est triple : interdire que plusieurs Threads ne réinitialisent ma Map en même temps, interdire que des Threads ne lisent ma Map quand elle est en train d'être réinitialisée, mais autoriser plusieurs threads à lire la Map en même temps (pour des raisons de performances, car cette Map est très solicitée et peu souvent réinitialisée).
1. Pas d'accès concurrent sur init() : Rajouter le mot clé synchronized sur ma méthode init() est je pense suffisant pour s'assurer qu'un seul Thread à la fois ne réinitialise la Map.
2. Ajouter synchronized à la méthode getMap() est suffisant pour éviter qu'un thread n'appelle ma map lorsqu'on rentre dans la méthode init(), car une méthode synchronized revient à placer un verrou sur la classe. Ce qui veut dire qu'il n'y a donc qu'une seule des méthodes synchronized qui peut être parcourue à la fois.
3. Mais avoir ajouté synchronized sur le getMap() empêche une lecture concurrente, ce qui ici est nécessaire. D'ou la question : comment autoriser une lecture concurrente, interdire une écriture concurrente, ainsi et surtout qu'interdire tout accès à la Map quand elle se réinitialise?
Merci d'avance!
Partager