web-dev-qa-db-fra.com

Les méthodes d'insertion et de suppression de LinkedBlockingQueue sont-elles sécurisées?

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

Ma question est la suivante: dois-je synchroniser l'accès sur add et take. L'insertion et la suppression de méthodes de LinkedBlockingQueue sont-elles sûres?

51
Steve Kuo

Oui. De les docs

"Les implémentations de BlockingQueue sont Thread-safe. Toutes les méthodes de mise en file d'attente Obtiennent leurs effets de manière atomique à l'aide de Verrous internes ou d'autres formes de contrôle de concurrence . includesAll, rétentionAll et removeAll ne sont pas nécessairement exécutées atomiquement sauf indication contraire dans une implémentation. Il est donc possible, par exemple, pour addAll (c) une exception) après n’ajoutant que certains des éléments de c. "

54
Matthew Flaschen

Oui, les méthodes BlockingQueue, add() et take() sont thread-safe mais avec une différence

Les méthodes add () et take() utilisent 2 objets ReentrantLock différents.

add() utilise la méthode 

private final ReentrantLock putLock = new ReentrantLock();

take() utilise 

private final ReentrantLock takeLock = new ReentrantLock();

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

Mais, l'accès simultané aux méthodes add() et take() n'est pas synchronized puisqu'il utilise 2 objets de verrouillage différents (sauf pendant la condition de la file d'attente pleine/vide de Edge).

11
Amrish Pandey

Tout simplement oui, il est définitivement thread-safe sinon il ne se serait pas qualifié pour stocker des éléments pour ThreadPoolExecutor .

Ajoutez et récupérez simplement un élément sans vous soucier de la simultanéité de BlockingQueue.

0
Java Guru