J'ai une question générale concernant la liste synchronisée. et j'ai une méthode ajoute un objet à la liste. P>
Disons que dans le constructeur, je crée une liste public void add(String s){
synchronizedList.add(s)
}
3 Réponses :
La liste synchronisée renvoyée par Il est impératif que l'utilisateur se synchronise manuellement sur la liste renvoyée lors de l'itération de celui-ci. P>
blockQuote>
Si votre liste est utilisée ailleurs, vous pouvez au moins le protéger à partir des appels de méthode individuels qui ne seraient autrement pas en sécurité. Si vous gérez tout à fait la liste, vous pouvez simplement ajouter un bloc code> synchronisé sur votre collections code> ne vous aidera pas dans votre cas. Ce n'est bon que si vous devez garantir un accès en série aux appels de méthode individuels. Si vous devez synchroniser autour d'un ensemble d'opérations plus grand, vous devez envelopper manuellement ce code dans un bloc code> synchronisé code>. Le Javadoc états: p>
Ajouter code> et utiliser le même verrou que vous utiliserez lors de l'itération sur elle. p>
BTW, il est explicitement dit dans le Javadoc pour collections.SynchronizedList : P> Il est impératif que l'utilisateur
synchroniser manuellement sur le retour
liste lors de l'itération: p>
blockQuote> synchronisélist code> ne garantit en effet que chaque méthode appelle sur la liste est synchronisée. Si vous avez besoin de plusieurs opérations à effectuer de manière synchronisée, vous devez gérer la synchronisation vous-même.
La liste synchronisée signifie que toutes les opérations de cette liste sont garanties pour être atomiques. Le scénario que vous décrivez nécessite d'avoir un peu de verrouillage en dehors de la liste. Pensez à des sémaphores ou de fabrication de Synchronized code> Block pour implémenter les moniteurs. Jetez un coup d'œil à java.util.concurrent . p>
Comme toutes les trois réponses, la liste synchronisée signifie que toutes les opérations de cette liste sont garanties pour être atomiques ou garantir un accès en série à des appels de méthode individuels. Je devais demander à mon collègue quelle est la moyenne. Donc, cela signifie opérations sur la liste comme (à partir de l'extrait de code ci-dessus)
synchronizedlist.size () code> et
synchronisélist.add (s) code> ne peut pas être en parallèle. Ce n'est pas évident pour certaines personnes qui lisent ce fil. Ainsi d'ajouter à aider les autres qui ne comprennent pas. Merci @ Whitefang34, @ JB-NIZET et @KHACHIK pour des explications ci-dessous.