2014-04-01 1 views
0

코드를 첨부했습니다. 이게 무슨 뜻입니까? synchronized (m) .. ?? 왜 우리가 그걸 사용해야하니 .. ?? synchronized (this) & synchronized (m) ...의 차이점은 무엇입니까?동기화 (인스턴스 필드)를 말할 때의 의미는 무엇입니까?

class Waiter implements Runnable { 

    Message m; 

    public Waiter(Message m) { 
     this.m = m; 
    } 

    @Override 
    public void run() { 
     String name = Thread.currentThread().getName(); 
     synchronized (m) { 
      try { 
       System.out.println("Waiting to get notified at time " +System.currentTimeMillis()); 
       m.wait(); 

      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
      System.out.println("Waiter thread notified at time "+System.currentTimeMillis()); 
      System.out.println("Message processed "); 
     } 
    } 
} 
+0

'synchronized (m)''->'Message' 객체를 잠급니다. –

+0

메시지 객체를 잠그는 이유는 무엇입니까 ?? 우리가 얻을 수있는 용도는 무엇인가 .. ?? 대신, 왜 우리는 synchronized (this)를 사용하지 말아야합니까? –

+0

@surendhar_s java의 각 객체는 'intrinsic lock'이라는 잠금을 가지고 있습니다. 'synchronized (this)'를 사용하면 클래스 Waiter의 현재 인스턴스와 관련된 잠금을 사용하게됩니다. –

답변

1

synchronized(this)synchronized(m)의 차이점은 this에서 동기화하면 전체 인스턴스에서 동기화된다는 것입니다. 따라서 예상대로 잠금을 유지하는 동안 아무 시체도 this에 동기화 할 수 없습니다.

public synchronized void foo() { 
    // Handle shared resource 
} 

개체를 사용하여

public void foo() { 
    synchronize(this) { 
     // Handle shared resource 
    } 
} 

비슷 등 m로, 당신은 당신이 때 동기화하고 싶은 이상 더 세밀한 제어를 얻을. 그러나 누군가가 foo는()를 사용하는 경우 위 그림과 같이, 그것은 this에 동기화되지 않은 방법에 대한 액세스 권한을 멈추지 않을 것입니다 기억 : 스레드가 foo()을 사용

public void anotherLock() { 
    synchronized(m) { 
     // Should handle another shared resource 
     // otherwise you might get unexpected results 
    } 
} 

동안 다른 스레드가 anotherLock()에 액세스 할 수 있습니다.

+0

또한 개인 개체를 동기화하면 외부 코드가 개체를 잠글 수 없습니다. – selig

1

자바 키워드 synchronized는 상호 배타적 인 세마포어의 역할, 하나 개의 인스턴스가 다른 스레드를 동기화하는 데 사용됩니다. 따라서 synchronized에 전달 된 인수는 하나의 스레드가 독점적으로 소유 할 수있는 인스턴스입니다. 프로그래머 인 당신에게 달려 있습니다. 어떤 경우에는 스레드를 동기화하고 싶습니다.

그러나 경주 조건에있는 리소스 또는 해당 리소스의 소유 인스턴스를 사용하는 것이 좋습니다. 동기화 된 블록을 나중에 시작하면 이전에 남겨 둘수록 응용 프로그램의 확장 성이 향상됩니다.

0

스레드 안전을 위해 사용됩니다. 귀하의 경우 관찰자 패턴을 구현하는 데 사용됩니다. 당신은 누군가가 당신이 기다리고있는 Message 객체 m에 대해 알릴 수 있도록 Message 객체에서 일어날 어떤 일이 일어날 때까지 기다리고 싶습니다. (m.wait()).

일부 개체를 기다릴 때 대기 개체의 동기화 된 블록에 wait() 문을 항상 넣어야하는 개체를 잠글 필요가 있습니다. 이것이 당신이 synchronized (m)를 사용하는 이유입니다.

객체 m에서 wait()를 호출 할 때 synchronized (this)로 바꿀 수 없으므로 synchronized는 m에만 있어야합니다.

응용 프로그램의 어딘가에서 m.notify() 또는 m.notifyAll()을 호출해야 m에서 wait()가 재개됩니다.