У меня есть многопоточная программа, в которой несколько потоков имеют доступ и редактируют мою структуру данных; Моя структура данных - это CopyOnWriteArrayList. Поскольку экземпляр CopyOnWriteArrayList является частью пакета Java Concurrent, мне все еще приходится обертывать структуру данных в блоке Synchronized, когда я выполняю операцию изменения на нем?Wrap CopyOnWriteArrayList в синхронизированном блоке
ответ
Ответ зависит от архитектуры вашей программы. Вы можете полностью создать программу из «потокобезопасных» классов, но это не обязательно сделает ваше приложение «потокобезопасным».
Вам нужна синхронизация всякий раз, когда у вас есть поток, который не может выполнять свою работу, не помещая данные в временно недействительное состояние. Чтобы заставить его работать, вы должны synchronize
процедуру, которая создает временное недействительное состояние, и вы также должны синхронизировать каждую процедуру, которая могла бы видеть состояние.
Итак, вопрос в том, есть ли какой-либо момент в выполнении вашей программы, когда один поток может поместить это CopyOnWriteArrayList
в состояние, которое вы не хотите видеть другим потоком? (Либо потому, что его содержимое внутренне противоречиво, либо потому, что оно несовместимо с какой-либо другой структурой данных).
Если ответ «Да», вам все равно нужна синхронизация.
Нить безопасный вариант ArrayList, в котором все операции мутационной (добавить, множество, и так далее) реализуются, делая новую копию основного массива.
В зависимости от того, как часто вы изменяете свои данные, CopyOnWriteArrayList
может быть и не лучшим вариантом. См. this StackOverflow question для некоторых возможных альтернатив.
- 1. Необходимость объекта в синхронизированном блоке
- 2. Прекращение резьбы в синхронизированном блоке
- 3. Неожиданный код в синхронизированном блоке
- 4. Поведение режима сна в синхронизированном блоке
- 5. Требуется ли выполнить ConcurrentHashMap в синхронизированном блоке?
- 6. Выполняется ли java.util.concurrent.ConcurrentHashMap.putIfAbsent в синхронизированном блоке?
- 7. Java вызова других методов в синхронизированном блоке
- 8. Вызов таймера java в синхронизированном блоке кодов
- 9. Необходимость волатильной записи массива в синхронизированном блоке
- 10. Доступ к статической переменной в синхронизированном блоке
- 11. приобретение блокировки другого объекта на синхронизированном блоке
- 12. Wrap маршруты в блоке в Rails
- 13. java: протоколирование прото-объектов в цикле в синхронизированном блоке
- 14. В Java, может ли коммутация потоков произойти в синхронизированном блоке?
- 15. Wrap MemoryStream в используемом блоке REST WCF
- 16. Любые побочные эффекты использования объекта рабочего экземпляра в синхронизированном блоке
- 17. Проблема при блокировке собственного объекта в синхронизированном блоке
- 18. Почему я получаю исключение IllegalMonitorException в синхронизированном блоке?
- 19. String неизменяемость и метод ожидания в синхронизированном блоке
- 20. Правильно ли я в своем предположении о синхронизированном блоке?
- 21. Работа с синхронизированной синхронизацией Java в синхронизированном блоке не работает
- 22. Что происходит, если объект блокировки изменяется в синхронизированном блоке
- 23. Что такое барьеры чтения и барьеры записи в синхронизированном блоке
- 24. Статический и нестатический объект блокировки в синхронизированном блоке
- 25. Почему метод wait() в синхронизированном блоке имеет тупик?
- 26. Java: ожидание на синхронизированном блоке, кто идет первым?
- 27. Поведение CopyOnWriteArrayList
- 28. CopyOnWriteArrayList изменение
- 29. Использование CopyOnWriteArrayList в Java
- 30. Как собрать поток в CopyOnWriteArrayList
Благодарим за ответ, я очень часто обновляю свои данные. Что бы вы предложили в качестве лучшего варианта? – Tony
@Tony: Я добавил ссылку на соответствующий вопрос. Не зная своего кода, я не могу вообще ничего предложить. – Marvin