2017-10-02 5 views
0

현재 Java에서 모니터의 사용법을 배우고 있지만 동기화 된 메서드의 작동 방식을 알지 못합니다.Java 모니터의 동기화 된 메서드

하나의 스레드가 동기화 된 메서드 안에 있지만 다른 스레드는 동기화 된 메서드 안에있을 수없고 해당 모니터의 자체 소유권을 제거하지 않는다는 것을 알고 있습니다.

그래서 내가

import java.util.Random; 
public class ex3 extends Thread { 

private static int nbA=0; 
private static int nbB=0; 
public static final Random rand = new Random(); 

public void run(){ 
    while(true){ 
     System.out.println(nbA+" "+nbB); 
     try{ 
      Thread.sleep(rand.nextInt(500)); 
     }catch (Exception e){e.printStackTrace();} 
     if (rand.nextBoolean()){ 
      try { 
       A(); 
      } catch (InterruptedException e) {} 
     }else{ 
      try { 
       B(); 
      } catch (InterruptedException e) {} 
     } 
    } 
} 

public synchronized void A() throws InterruptedException{ 
    nbA++; 
    Thread.sleep(rand.nextInt(500)); 
    nbA--; 
} 

public synchronized void B() throws InterruptedException{ 
    nbB++; 
    Thread.sleep(rand.nextInt(500)); 
    nbB--; 
} 

public static void main(String[] argv){ 
    new ex3().start(); 
    new ex3().start(); 
    new ex3().start(); 
} 
} 

가 나는 프로 농구 (NBA) 또는 NBB가 NBB 및 NBA 1 또는 우수한 것이 불가능하다고 생각하는지 테스트하는 코드를 작성하려고 둘> 0하지만

일이야 나는 무엇을 오해 하는가?

죄송합니다.

답변

0

다른 개체에서 동기화 중입니다. synchronized 비 정적 메서드는 this에 동기화되므로 new ex3() 인스턴스 각각은 동기화되지 않은 것처럼 효과적으로 작동합니다.

public void A() { 
    synchronized (this) { 
     // The body. 
    } 
} 

중 하나가 동기화 방법 static 만들거나 명시 적으로 클래스 (또는 뭔가 다른 공유 객체)에 동기화 :

public void A() throws InterruptedException{ 
    synchronized (ex3.class) { 
     nbA++; 
     Thread.sleep(rand.nextInt(500)); 
     nbA--; 
    } 
} 
0

은 동기화 된 인스턴스 메소드는,이 정확히 동일합니다

하나의 스레드가 동기화 된 메서드 안에 있지만 다른 스레드는 동기화 된 메서드 안에있을 수 없다는 것을 알고 있습니다.

틀린. 동일한 객체에서 동기화 된 동기화 된 메서드 안에있을 수 없습니다. 다른 동기화 된 메서드 내부에있을 수도 있고 같은 메서드를 다른 개체와 동기화 할 수도 있습니다.

이 모니터 자체 소유권을 벗어나지 않습니다.

수정.

NB Per Brinch Hansen은 Java가 모니터를 가지고 있다고 생각하지 않고 그가 발명했습니다.