vous synchronisez deux fois, ce qui est inutile et peut-être ralentit le code: modifications en itérer sur la liste ont besoin d'un synchronnization sur l'opération , que vous faites avec synchronized (in_queue_list)
L'utilisation de Collections.synchronizedList()
est superflue dans ce cas (il crée un wrapper qui synchronise les opérations individuelles).
Cependant, puisque vous videz complètement la liste, la suppression répétée du premier élément est la pire des façons possibles, pour chaque élément, tous les éléments suivants doivent être copiés, ce qui en fait un O (n^2) opération - horriblement lent pour les plus grandes listes.
Appelez simplement clear()
- aucune itération n'est nécessaire.
Edit: Si vous avez besoin de la synchronisation unique méthode de Collections.synchronizedList()
plus tard, alors c'est la bonne façon:
List<Record> in_queue_list = Collections.synchronizedList(in_queue);
in_queue_list.clear(); // synchronized implicitly,
Mais dans de nombreux cas, la synchronisation unique méthode est insuffisante (par exemple pour toute itération, ou quand vous obtenez une valeur, faites des calculs basés dessus et remplacez-le par le résultat). Dans ce cas, vous devez utiliser la synchronisation manuelle de toute façon, donc Collections.synchronizedList()
est juste inutile.
Vous ne pouvez pas vraiment mettre à niveau une liste à synchroniser car une référence vous est transmise, vous ne la possédez donc pas réellement. Tout ce qui vous a donné la référence pourrait encore modifier la liste originale qui vous a été transmise simultanément. Indépendamment de la synchronisation que vous ajoutez, à moins que l'on sache explicitement que la liste sera protégée par son verrou intrinsèque. –
Je vais mettre un bloc synchronisé autour de toute opération dans la file d'attente. Merci! – bob