2009-12-13 6 views
3

동기화의 이해 :이 코드를 감안할 때

public class Messager implements Runnable {    

    public static void main(String[] args) { 
     new Thread(new Messager("Wallace")).start();  
     new Thread(new Messager("Gromit")).start();    
    }    
    private String name;     
    public Messager(String name) { this.name = name; }    
    public void run() {  
     message(1); message(2);  
    }   
    private synchronized void message(int n) {  
    System.out.print(name + "-" + n + " ");  
    }  
} 

은 내가 synchronized 키워드는 개체의 잠금 스레드가 의존하게 이해합니다. 질문 :

a) synchronized으로 표시된 방법이 완료되면 즉시 잠금이 해제 되나요? 또는 스레드의 run() 메서드가 완료되면 b) 스레드 중 하나가 다른 이름 앞에 1 2을 인쇄하도록 할 수 있습니까?

+0

실제로 두 개의 서로 다른 인스턴스가 잠겨 있으므로 'sycnhronized'는 아무 것도하지 않습니다. (명시 적으로 modifier가 아닌 synchronized 블록을 사용하면 더 명확 해집니다. 별도의 lock 객체를 사용하는 것이 좋습니다.) –

답변

2

A. 예. synchronized 기능이 완료 되 자마자 출시됩니다.
B. 예. 하지만 그렇게하고 싶다면 왜 멀티 스레드 코드를 작성해야합니까? synchronized은 순서에 관한 것이 아니라 원 자성을 보장하지만 플래그 변경을 기다려서 명령을 시행 할 수 있습니다. 어쨌든 시행하려는 것은 연속성입니다. 단일 스레드 환경에서는 이것을 무료로 얻을 수 있습니다 :)

+0

아, 나는 "what if"질문을하고 있습니다. 나는 scjp를 위해 공부하고있다. 감사. – andandandand

+0

dmindreader, 앞으로 scjp에 새 태그 scjp를 추가하십시오. 감사합니다. –

관련 문제