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?
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. "
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).
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.