2017-10-26 2 views
-1

자바에서 동기화 테스트를하고 있습니다. 결과물은 내가 예상 한 것이 아닙니다. 동기화 된 메서드의 잠금이 작동하지 않는 것 같습니다. 문제에 대한 아이디어가 있습니까? 당신은 논리에서 어떤 실수를 보았습니까?동기화 된 메소드 문제

class Sum implements Runnable{ 
    Thread th; 
    int start; 
    int end; 
    Sum(int start, int end){ 
      th = new Thread(this); 
      this.start = start; 
      this.end = end; 
      th.start(); 
    } 
    synchronized void count(){ 
      System.out.println("Starting " + this.start); 
      System.out.println("Ending " + this.end); 
    } 
    public void run(){ 
      count(); 
    } 
    public static void main(String[] args){ 
      Sum th1 = new Sum(1, 100); 
      Sum th2 = new Sum(101, 200); 
    } 
} 
+0

무엇이 보이며 무엇을 기대합니까? –

+0

첫 번째 스레드가 인쇄를 시작하면 간섭없이 첫 번째 스레드가 run()을 완료 할 것으로 기대합니다. 시작 중 ... 종료 ... 두 번째 스레드와 동일합니다. 출력 시작 중 ... 시작 중 ... 종료 중 ... 종료 중 ... –

답변

1

귀하의 문제는 당신이 synchronized 키워드가 Sum 개체의 모든 인스턴스를 잠그는 데 사용 될 수 있다는 것을 가정한다는 것이다. synchronized 키워드는 단일 개체에서만 동기화됩니다. (두 개의 서로 다른 해쉬 맵이 있고, 다른 해쉬 맵에 삽입했기 때문에 삽입 할 수 없다고 상상해보십시오.별로 의미가 없습니다).

count 메서드가 모든 Sum 개체에 대해 동기화되도록하려는 경우 접근 방식이 달라야합니다.