Какую синхронизацию следует использовать для перебора подсписка, возвращенного из SynchronizedList в результате вызова метода subList()?
В документации для 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());
}
Как я понимаю из исходного кода, SynchronizedList может использовать другой мьютекс, отличный от этого. В частности, это происходит, когда SynchronizedList является подсписком. Означает ли это, что в следующем примере используется неправильная синхронизация при условии, что List subList =syncedList.subList(2, 5);? Разве об этом не стоит упомянуть в документации?
synchronized (subList) {
Iterator i = subList.iterator();
while (i.hasNext())
foo(i.next());
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... st-in-java