2016-01-07 3 views
0

У меня есть многопоточная программа, в которой несколько потоков имеют доступ и редактируют мою структуру данных; Моя структура данных - это CopyOnWriteArrayList. Поскольку экземпляр CopyOnWriteArrayList является частью пакета Java Concurrent, мне все еще приходится обертывать структуру данных в блоке Synchronized, когда я выполняю операцию изменения на нем?Wrap CopyOnWriteArrayList в синхронизированном блоке

ответ

0

Ответ зависит от архитектуры вашей программы. Вы можете полностью создать программу из «потокобезопасных» классов, но это не обязательно сделает ваше приложение «потокобезопасным».

Вам нужна синхронизация всякий раз, когда у вас есть поток, который не может выполнять свою работу, не помещая данные в временно недействительное состояние. Чтобы заставить его работать, вы должны synchronize процедуру, которая создает временное недействительное состояние, и вы также должны синхронизировать каждую процедуру, которая могла бы видеть состояние.

Итак, вопрос в том, есть ли какой-либо момент в выполнении вашей программы, когда один поток может поместить это CopyOnWriteArrayList в состояние, которое вы не хотите видеть другим потоком? (Либо потому, что его содержимое внутренне противоречиво, либо потому, что оно несовместимо с какой-либо другой структурой данных).

Если ответ «Да», вам все равно нужна синхронизация.

0

No, you don't have to:

Нить безопасный вариант ArrayList, в котором все операции мутационной (добавить, множество, и так далее) реализуются, делая новую копию основного массива.

В зависимости от того, как часто вы изменяете свои данные, CopyOnWriteArrayList может быть и не лучшим вариантом. См. this StackOverflow question для некоторых возможных альтернатив.

+0

Благодарим за ответ, я очень часто обновляю свои данные. Что бы вы предложили в качестве лучшего варианта? – Tony

+0

@Tony: Я добавил ссылку на соответствующий вопрос. Не зная своего кода, я не могу вообще ничего предложить. – Marvin

Смежные вопросы