54 votes

Les méthodes d'insertion et de suppression de la LinkedBlockingQueue sont-elles thread safe ?

J'utilise LinkedBlockingQueue entre deux threads différents. Un thread ajoute des données via add tandis que l'autre thread reçoit les données via take .

Ma question est la suivante : dois-je synchroniser l'accès à add y take . Est LinkedBlockingQueue Les méthodes d'insertion et de retrait de l'utilisateur sont-elles sûres ?

58voto

Matthew Flaschen Points 131723

Oui. De les docs :

"Les implémentations de BlockingQueue sont sûres pour les fils. Toutes les méthodes de mise en file d'attente obtiennent leurs effets de manière atomique en utilisant verrous internes ou d'autres formes de contrôle de la concurrence. Cependant, l'essentiel des opérations de collecte addAll, containsAll, retainAll et removeAll ne sont pas nécessairement exécutées de manière atomique, sauf indication contraire dans une implémentation. Il est donc Il est donc possible, par exemple, que addAll(c) échoue (en lançant une exception) après après avoir ajouté seulement certains des éléments de c."

13voto

Amrish Pandey Points 56

Oui, BlockingQueue méthodes add() y take() sont sans fil mais avec une différence .

add () y take() utilise 2 méthodes différentes ReentrantLock objets.

add( ) utilise la méthode

private final ReentrantLock putLock = new ReentrantLock();

take() la méthode utilise

private final ReentrantLock takeLock = new ReentrantLock();

Par conséquent, l'accès simultané à add() est synchronisée. De même, l'accès simultané à take() La méthode est synchronized .

Mais, l'accès simultané à add() y take() n'est pas synchronized puisqu'ils utilisent deux objets de verrouillage différents (sauf pendant la condition de bord de la file d'attente pleine/vide).

-1voto

Java Guru Points 163

Tout simplement Oui, il est définitivement thread safe sinon il n'aurait pas été qualifié comme candidat pour le stockage de l'élément pour ThreadPoolExecutor .

Il suffit d'ajouter et de récupérer un élément sans se soucier de la concurrence pour BlockingQueue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X