В многопоточном Java-приложении мне нужно перебирать коллекцию объектов. Поскольку и коллекция, и объекты могут быть изменены другим потоком, пока я перебираю их, Мне нужно использовать синхронизацию.
Однако вложенные синхронизированные блоки не рекомендуются, так как они могут привести к взаимоблокировкам. Как мне решить эту проблему?
Collection<Data> dataCollection = something.getDataCollection();
synchronized ( dataCollection ) {
for ( final Data data : dataCollection ) {
synchronized ( data ) {
data.doSomething(); // doSomething() changes object state
}
}
}