synchronizedCollection и содержит - нужно ли синхронизировать вручную? - PullRequest
3 голосов
/ 29 января 2010

Я использую Collections.synchronizedCollection в Java для защиты набора, к которому, как мне известно, обращаются одновременно многие потоки.Java API предупреждает:

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

Collection c = Collections.synchronizedCollection(myCollection);
     ...
  synchronized(c) {
      Iterator i = c.iterator(); // Must be in the synchronized block
      while (i.hasNext())
         foo(i.next());
  }

"

Если я использую c.contains(obj) Это потокобезопасно?Внутренне, очевидно, это перебирает коллекцию и проверяет, равен ли какой-либо из объектов в ней объекту obj.Мой инстинкт состоит в том, чтобы предположить, что это, вероятно, синхронизировано (это может показаться серьезным сбоем, если нет), но, учитывая предыдущие проблемы с синхронизацией, представляется целесообразным перепроверить, и поиск в Google ответов на этот вопрос не обернулсячто угодно.

Ответы [ 3 ]

7 голосов
/ 29 января 2010

Сам по себе звонок на contains безопасен.

Проблема в том, что часто проверяют, содержит ли коллекция элемент , затем что-то делает с коллекцией на основе результата.

Скорее всего, тест и действие должны рассматриваться как единая атомарная операция. В этом случае должна быть получена блокировка коллекции, и обе операции должны выполняться в блоке synchronized.

2 голосов
/ 29 января 2010

Collections.synchronizedCollection() вернет коллекцию thread safe, что означает любой отдельный вызов метода thread safe сам по себе. Это зависит от того, что вы хотите сделать. Если вы хотите вызвать несколько методов, java не может сделать это потокобезопасным вместе.

1 голос
/ 29 января 2010

Это безопасно, потому что contains сам синхронизирован.

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