2017-10-02 2 views
0

現在、Javaでモニタの使用を学習していますが、同期メソッドの仕組みがわかりません。Javaモニタの同期メソッド

私は、あるスレッドが同期メソッドの中にある間に、別のスレッドを同期メソッドの中に入れることができず、スリープが自分自身の所有権を引き取らないことを理解します。

ので、私はNBAやNBBが1よりも優れていることは不可能であったか、NBBとNBAの両方が> 0ですが、それは

が起こっていると考えられ

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(); 
} 
} 

ことをテストするコードを記述してみました私は何を誤解していますか?

ご迷惑をかけて申し訳ありません。

答えて

0

​​非スタティックメソッドは、thisで同期するため、new ex3()インスタンスはそれぞれ、同期されていないように効果的に動作します。

同期インスタンスメソッドは、このとまったく同じです:

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

synchronizedメソッドstaticを作る、または明示的にクラス(または何か他の共有オブジェクト)に同期する次のいずれか

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

私は、1つのスレッドが同期メソッド内にある間に、別のスレッドが同期メソッド内にあることができないことを理解します。

間違っています。同期されたメソッドの中に同じオブジェクトで同期させることはできません。これは、他の同期化されたメソッドの内部にあっても、別のオブジェクトで同期された同じメソッドであってもかまいません。

このスリープでは、モニタ自身の所有権が剥奪されません。

正しい。

NB Per Brinch Hansenは、Javaにモニターがあるとは考えておらず、彼はそれらを発明しました。

関連する問題