Как предотвратить вложенные синхронизированные блоки при итерации по коллекции

В многопоточном Java-приложении мне нужно перебирать коллекцию объектов. Поскольку и коллекция, и объекты могут быть изменены другим потоком, пока я перебираю их, Мне нужно использовать синхронизацию.

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

Collection<Data> dataCollection = something.getDataCollection();

synchronized ( dataCollection ) {
  for ( final Data data : dataCollection ) {
    synchronized ( data ) {
      data.doSomething();  // doSomething() changes object state
    }
  }
}
6
задан Sven Jacobs 26 February 2011 в 18:28
поделиться