2016-07-15 1 views
0

코드는 아래와 같이 니펫을 조작 할 수 있습니다 :왜 동기화 된 객체는 여전히

List<String> list = new ArrayList<>(); 

public void addValue(int i) { 
    synchronized (list) { 
     list.add("list" + i); 
    } 
} 

내 질문은 키워드 synchronized 의해 잠겨 그 무엇.
두 스레드가 코드 블록을 실행하도록 요청할 때 list을 어떻게 검사 할 예정입니까?
같은 질문은 this을 동기화했지만 그 필드는 여전히 변경 될 수 있습니다.

답변

0

동기화 된 블록이 잠겨 있습니다. 코드가 실행되면 스레드가 객체를 잠그지 않고 대신 OB30INS 객체의 자물쇠 (객체 헤더 안의 표제어)를 사용하여 다른 스레드가 동일한 잠금을 얻을 수 없도록합니다. 결과적으로 블록 내부의 코드는 동시에 하나의 스레드에 의해서만 실행될 수 있습니다.