2010-06-12 7 views
0

! #간단한 자바 동기화 질문

public class test { 
    boolean val 
    def obj=new Object() 

    def dos() { 
    val=false 
    Thread.start() { 
     synchronized(obj) { 
    val=true 
    obj.notifyAll() 
     } 
    } 
    Thread.sleep(5000) 
    synchronized(obj) { 
     while (!val) { 
    obj.wait() 
     } 
    } 
    } 

    static void main(String[] args) { 
    def t=new test() 
    t.dos() 
    } 
} 

확인 그루비는/usr/빈/ENV, 여기에 더 자세히 내 문제입니다.

스레드 (A) 별도의 스레드에서 작업을 시작한 다음 완료 될 때까지 기다립니다. - 그렇지 않으면 thread.join()을 사용하면 틀림없이 참입니다. 이 스레드는 실제로 다음 조치를

class A { 
    private boolean finished 

    public synchronized void methodOne() { 
     finished=true; 
     notifyAll(); 
    } 

    public void methodTwo() { 
     new ThreadThatCallsMethodOneWhenDone().start(); 
     synchronized(this) { 
      while (!finished) { 
       wait(); 
      } 
     } 
    } 
} 

완성 된이 코드는 괜찮 때 우리가 신호를 얻거나 아직도 잠재적 인 문제로 실행하고 결국 methodOne

나사 (B) 신호 작업을 시작? 무엇이 더 좋은 방법으로 해결할 수 있습니까? 올

미샤


궁금 :

옵션 1 개

class A { 
    public void methodOne() { 
     synchronized(this) { 
      modifyvalue 
      notifyAll() 
     } 
    } 

    public void methodTwo() { 
     while (valuenotmodified) { 
      synchronized(this) { 
       wait() 
      } 
     } 
    } 

옵션 2

class A { 
    public void methodOne() { 
     modifyvalue 
     synchronized(this) { 
      notifyAll() 
     } 
    } 

    public void methodTwo() { 
     while (valuenotmodified) { 
      synchronized(this) { 
       wait() 
      } 
     } 
    } 

그 이유는 무엇입니까?

+5

21 개의 질문, 3 개의 답변이 허용되었습니다. 그들 모두 정말 그렇게 나빴나요? – danben

답변

4

귀하의 valuenotmodified 검사가 동기화없이 수행 되었기 때문에 두 가지 모두 위험하다고 생각합니다. 따라서 methodTwo이 변경되었는지 확인하는 동안 methodOne이 값을 수정하면 어떤 일이 발생하는지 알 수 없습니다.

두 가지 "옵션"의 차이점은 없습니다. 둘 다이 잠재적 인 문제가 있습니다.

+0

OP를위한 Addtional, wait() 전에 notifyAll()을하면 wait()가 영원히 기다릴 수 있습니다. 이것은 귀하의 예에서 발생할 수 있습니다. –

0

동기화해야 "값"에 대한 모든 액세스 : 처음으로 1998 년에 출시 된 더 나은 동시성 라이브러리에 의해 처리되는 같은

class A { 
    public synchronized void methodOne() { 
     modifyvalue 
     notifyAll() 
    } 

    public synchronized void methodTwo() { 
     if (valuenotmodified) { 
      wait() 
     } 
    } 
} 
0

문제 :

class A { 
    public void methodOne() { 
     synchronized(this) { 
      modifyvalue 
      notifyAll() 
     } 
    } 

    public void methodTwo() { 
     synchronized(this) { 
      if (valuenotmodified) { 
       wait() 
      } 
     } 
    } 

} 

참고이 동등이다 2004 년 JDK 5의 일부가되었다. notify/notifyAll/wait 구문보다 사용하고 이해하기가 훨씬 쉬워 졌으므로 이들을 사용하는 법을 배운다. 귀하의 경우에는

당신은 코멘트 자바 독에서 Condition를 사용할 수

조건 개체 모니터 방법 여러 를 보관 유지하는 효과를 부여 (잠깐 통지하고 의 notifyAll) 에 별개의 객체로를 요인 임의의 잠금 구현을 사용하여 을 결합하여 객체 당 대기 세트를 생성합니다.잠금이 동기 메서드 및 문 대신 사용하는 경우 조건은 개체 모니터 메서드 사용을 바꿉니다.