Java - общий вопрос о synchronizedList - PullRequest
7 голосов
/ 24 мая 2011

У меня общий вопрос относительно синхронизированного списка.
Допустим, в конструкторе я создаю список

List synchronizedList = Collections.synchronizedList(list);

и у меня один метод добавляет объект в список.

public void add(String s){ 
    synchronizedList.add(s)
}

Существует еще один поток, который каждые несколько секунд проверяет наличие нескольких строк, выводит их в файл и удаляет их все.

Теперь допустим, что я повторяю каждую строку и сохраняю ее в БД. после всей итерации очищаю список.

Как мне помогает поддержка многопоточности?
Я мог бы добавить элемент в список непосредственно перед тем, как произойдет очистка () в другом потоке.
Если я сам не управляю блокировкой (для этого мне не нужен синхронизированный список), то он сам.

Ответы [ 3 ]

13 голосов
/ 24 мая 2011

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

Кстати, об этом прямо сказано в javadoc для Collections.synchronizedList :

Обязательно, чтобы пользователь вручную синхронизировать по возвращаемому список при итерации по нему:

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
13 голосов
/ 24 мая 2011

Синхронизированный список, возвращаемый Collections, не поможет в вашем случае.Это хорошо, только если вам нужно гарантировать последовательный доступ к отдельным вызовам методов.Если вам нужно синхронизировать больший набор операций, вам нужно вручную обернуть этот код в блок synchronized. Javadoc заявляет:

Крайне важно, чтобы пользователь вручную синхронизировал возвращаемый список при итерации по нему.

Если ваш список используетсяв другом месте вы можете по крайней мере защитить его от отдельных вызовов методов, которые в противном случае не были бы поточно-ориентированными.Однако если вы полностью управляете списком, вы можете просто добавить блок synchronized в свой метод add и использовать ту же блокировку, которую вы будете использовать при итерации по нему.

4 голосов
/ 24 мая 2011

синхронизированный список означает, что все операции в этом списке гарантированно будут атомарными. Сценарий, который вы описываете, требует некоторой блокировки вне списка. Рассмотрим семафоры или создание блока synchronized для реализации мониторов. Взгляните на java.util.concurrent .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...