2010-01-18 7 views
3

Je suis à la recherche à la méthode statiquefacilité d'utilisation synchronisée ... méthodes java.util.Collections

Collections.synchronizedList(List<T> list) 

Javadoc dit

Il est impératif que l'utilisateur synchronise manuellement sur le retour liste lors de l'itération dessus ...

Quel est le but de la création d'une liste synchronisée si je dois encore la synchroniser manuellement?

+1

Plus généralement, vous devez synchroniser manuellement chaque fois que vous devez effectuer des appels de méthode * multiples sans que l'état ne change entre les deux. Par exemple, pour obtenir le dernier élément d'une liste: 'synchronized (list) {return list.get (list.size() - 1);}'. –

Répondre

7

La raison pour laquelle vous utilisez

Collections.synchronizedList(List<T> list) 

est parce que toutes les méthodes, mais l'itérateur sont synchronisées en utilisant la liste elle-même comme le mutex de sorte que vous ne devez pas faire

synchronized(list) { 
    list.add(type); 
} 

lieu vous pouvez simplement faire

list.add(type); 

et il sera thread-safe.

La seule méthode qui n'est pas synchronisée est lors de l'itération de la liste. L'itérateur de liste ne peut pas être renvoyé de façon synchronisée, puisque vous l'itérez ensuite, ce qui explique pourquoi il est nécessaire de synchroniser manuellement la liste. Donc, en conclusion, vous n'avez qu'à synchroniser la liste quand vous itérez dessus, tout ce que vous n'avez pas à faire.

1

Le java collections tutorial explique cela. Fondamentalement, chaque itération appelle plusieurs appels à la collection sous-jacente. Ces appels peuvent être atomisés en une seule «transaction».

Questions connexes