7
votes

Java - Question de la synchronisation générale

J'ai une question générale concernant la liste synchronisée.
Disons que dans le constructeur, je crée une liste xxx pré>

et j'ai une méthode ajoute un objet à la liste. P>

public void add(String s){ 
    synchronizedList.add(s)
}


1 commentaires

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 () et synchronisélist.add (s) 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.


3 Réponses :


13
votes

La liste synchronisée renvoyée par collections 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 synchronisé . Le Javadoc états:

Il est impératif que l'utilisateur se synchronise manuellement sur la liste renvoyée lors de l'itération de celui-ci.

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 synchronisé sur votre Ajouter et utiliser le même verrou que vous utiliserez lors de l'itération sur elle.


0 commentaires

13
votes

synchronisélist 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.

BTW, il est explicitement dit dans le Javadoc pour collections.SynchronizedList :

Il est impératif que l'utilisateur synchroniser manuellement sur le retour liste lors de l'itération: xxx


0 commentaires

4
votes

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 Block pour implémenter les moniteurs. Jetez un coup d'œil à java.util.concurrent .


0 commentaires