Привет,
ревьюил тут код свой и возник вопрос по синхронизации:
final private LinkedList<Integer> numbers = new LinkedList<>();
...
synchronized (this.numbers) { // sync on the same instance, w/o special lock
this.numbers.addAll(other.numbers);
}
Есть ли разница синхронизироваться на внешнем объекте (как во многих руководствах) или код выше вполне себе допустим?
Есть ли ограничения приведенного выше кода?
Попутно есть еще такой вопрос:
Правильно ли я понимаю что для синхронизированных коллекций, например
final private LinkedList<Integer> numbers = Collections.synchronizedList(new LinkedList<>());
При использовании коллекции в цикле
for (Integer number: numbers) ...
коллекция будет лочится на все время цикла для обеспечения целостности итераторов?
Или корректно было бы сделать
final private LinkedList<Integer> local;
synchronized(this.lock) { local = new LinkedList<>(this.numbers); }
for (Integer number: local) ...
?