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;
}
}
(코드 사랑 this excellent answer에서 차용)이 코드에서
, 할 수있는 하나의 스레드 호출 add
또 다른 makeSnapshot
를 호출하는 동안?. 즉, synchronized (items)
에 의해 생성 된 잠금이 시도 된 모든 읽기에 영향을 미치지 만 items
또는 makeSnapshot()
메서드를 통해 시도한 읽기에만 영향을 줍니까?
public void add(T item) {
synchronized (items) {
// Add item while holding the lock.
items.add(item);
}
}
이 제거 부작용은 무엇인가
원래 포스트 실제로 추가 방법에synchonized
잠금을 사용?
* add * 메소드에서 * synchronized *을 제거하면 * makeSnapshot *을 호출 할 때 * 다른 스레드가 추가 한 모든 항목의 "스냅 샷"을 가져 오는 것이 전혀 보장되지 않습니다. 따라서 지금까지 내가 * 동기화 * 호출 제거의 부작용을 볼 수있는 지금은 코드가 깨졌습니다. 그 외에도 일관성없는 국가에 도달하는 것이 가능할 수도 있습니다 ... –