2010-07-07 2 views
2

У меня есть два потока и один класс.Проблема синхронизации Java

Thread1 обновляет локальный объект класса с помощью 3 различных методов. Локальный объект (за сценой) использует некоторый ArrayList для хранения данных. Три метода (упомянутые ранее) делают что-то с элементами списка ...

Thread2 запрашивает локальный объект (содержимое списка массивов).

ПРОБЛЕМА: Как я могу убедиться, что ни один из трех методов обновления (Thread1) не изменит содержимое «локального объекта», пока он читается Thread2?

Благодаря

ответ

1

Поместите общий замок вокруг частей кода, которые изменяют ArrayList, используя синхронизированный. Это действительно не имеет значения, какой объект используется в качестве шлюза, если это то же самое, но я думаю, что с помощью ArrayList самого бы идиоматические:

synchronized (list) { 
    list.put()... 
} 

synchronized (list) { 
    list.get()... 
} 
+0

звучит логично для mee! Я попробую! – user318247

+0

Если метод читается из списка и затем изменяет его на основе прочитанного, вам нужен один блок для обоих методов. –

+0

Нужно ли синхронизировать, даже если я красню данные ... чтобы убедиться, что никакая модификация не выполняется, пока я заканчиваю чтение? – user318247

0

Вы можете сделать методы, которые доступ к данным (чтения или записи) «синхронизируются».

+0

Вы имеете в виду методы «локального объекта» или методы класса? – user318247

0

Во всех описанных выше методах используется контекст synchronized(your_list) { ... code ... }, что делает методы synchronized, возможно, сложным, блокирует больше, чем необходимо, если вы просто хотите защитить список, а не весь объект.

0

Использования synchronized ключевого слова. Вы имеете дело с проблемой, известной как critical sections

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