2014-06-21 2 views
0

에 나는이 같은 클래스를 가지고있다. 자바에서 이것을 어떻게 할 수 있습니까?동기화 두 가지 방법이 자바

안부

+1

대답은 질문의 제목입니다. 그것들을 동기화 시키십시오 :'public synchronized void draw() {...};'(그리고 foo도 마찬가지입니다.) http://docs.oracle.com/javase/tutorial/essential/concurrency/ –

+1

Java에서 헝가리 표기법을 사용하고 있으며 (이는 드문 경우입니다.) 잘못 사용하고 있습니다 (구체적인 클래스를 사용하는 동안 인터페이스를 의미합니다) . –

+0

은 메서드를 동기화하고 draw()에서 객체 스레드가 foo()를 호출하도록합니다. – Alex

답변

4

동기화 방법을 만듭니다.

public synchronized void draw() { System.out.println("draw"); } 

public synchronized void foo() { System.out.println("foo"); } 

또는 동일한 개체에서 동기화하십시오.

방법에 synchronized 퍼팅
private static final Object syncObj = new Object(); 

public void draw() { 
    synchronized (syncObj) { 
     System.out.println("draw"); 
    } 
} 

public void foo() { 
    synchronized (syncObj) { 
     System.out.println("foo"); 
    } 
} 
+0

왜 syncObj를 정적으로 만들었습니까? 모든 인스턴스에서 메소드 호출을 동기화해야합니다. 그러나 그것은 나쁜 것입니다. 그럼 정적 수정자를 간단히 제거 할 수 있습니까? – user2224350

+0

'static'modifier를 제거하면 각 객체는 다른 syncObject를 가지게됩니다. 원하는 객체에 의존합니다. '정적'은 그 클래스의 모든 인스턴스에 의존하지 않고, 그 클래스의 모든 인스턴스에 의존한다. – Zarathustra

0

스레드가 그 방법을 입력하기 전에 개체 인스턴스에 대한 잠금을 획득하는 것을 의미하므로이 경우 두 가지 방법이 그들을 같은 잠금 경쟁됩니다 입력 스레드를 동기화 표시된, 하나의 스레드가 잠금을 얻으면 다른 모든 스레드는 동일한 잠금에서 동기화되는 모든 메소드를 종료합니다. 두 가지 방법이 동시에 실행하기 위해서는 그래서 그들은이 같은 다른 잠금을 사용하는 것이다 :

public class IClass { 

     private final Object lockDraw = new Object(); 
     private final Object lockFoo = new Object(); 

     public void draw() { 
      synchronized(lockDraw) { 
      //method draw 
      } 
     } 

     public void foo() { 
      synchronized(lockFoo) { 
      //method foo 
      } 
     } 
} 

Both methods lock the same monitor. Therefore, you can't simultaneously execute them on the same object from different threads (one of the two methods will block until the other is finished).

+0

snyc 객체가'정적 '이 아니므로 각 객체는 다른 모니터를 갖게됩니다. – Zarathustra

관련 문제