Вам не нужен второй synchronized
, если у вас там есть первый. Как отмечает Зед, invokeAll()
будет блокироваться, пока все задачи не будут выполнены. Между тем, синхронизация вокруг add()
обеспечит видимость изменений в коллекции для всех потоков, включая исходный вызывающий поток.
Что касается того, нужен ли вам первый один (о котором вы не спрашивали) - я попытался удалить оба блока synchronized
и не смог его вызвать, но он был там вероятно, более безопасная ставка. Согласно javadoc для LinkedList
:
Если несколько потоков обращаются к
LinkedList одновременно и по крайней мере
один из потоков изменяет список
структурно, это должно быть
внешняя синхронизация.
Другие реализации Collection
2-го поколения имеют аналогичные предупреждения.
Заметьте, кстати, что нет ничего волшебного в синхронизации самой коллекции. Вы можете объявить отдельный мьютекс (любой старый Object
) во внешнем классе или выполнить синхронизацию с экземпляром внешнего класса, и это будет работать так же хорошо, если все WorkHorse
синхронизируются на одном и том же.