Я пытаюсь лучше понять объем блокировки, выданной во время вызова synchronized
.
Например:
class CopyOnReadList<T> {
private final List<T> items = new ArrayList<T>();
public void add(T item) {
items.add(item);
}
public List<T> makeSnapshot() {
List<T> copy = new ArrayList<T>();
synchronized (items) {
// Make a copy while holding the lock.
for (T t : items) copy.add(t);
}
return copy;
}
}
(Код с любовью заимствован у этот отличный ответ )
В этом фрагменте кода один поток может вызывать add
, в то время как другой вызывает makeSnapshot
?. То есть, влияет ли блокировка, созданная synchronized (items)
на все попытки чтения на items
, или только на попытки с помощью метода makeSnapshot()
?
Оригинальный пост фактически использовал блокировку synchonized
в методе add:
public void add(T item) {
synchronized (items) {
// Add item while holding the lock.
items.add(item);
}
}
Каков побочный эффект удаления этого?