#topicpath
----
#contents

まだ全然わかってないんですが、いろいろメモ。

*** synchronizedってどこが同期化されるか
下のクラスはsynchronizedのメソッドとそうでないメソッドがあります。
 public class Data {
  public synchronized void syncExecute() {
   System.out.println("syncExecute実行中......");
   try {
    Thread.sleep(3000);
   } catch (InterruptedException e) {
   }
 
   System.out.println("syncExecute実行終了");
  }
 
  public void execute() {
   System.out.println("execute実行");
  }
 }

それぞれのメソッドを呼び出すスレッドがあるとします。
 class SyncThread extends Thread {
  private Data data;
  public SyncThread(Data data) {
   this.data = data;
  }
  public void run() {
   data.syncExecute();
  }
 }
 
 class TestThread extends Thread {
  private Data data;
  public TestThread(Data data) {
   this.data = data;
  }
  public void run() {
   data.execute();
  }
 }

このスレッドを同時に実行すると、
 public class ThreadTest{
  public static void main(String[] args) {
   System.out.println("Start.");
 
   Data data = new Data();
   new SyncThread(data).start();
   new TestThread(data).start();
 
   System.out.println("End.");
  }
 }
結果は
 Start.
 End.
 syncExecute実行中......
 execute実行      <- syncExecute実行中にも実行されている
 syncExecute実行終了
ってなって、synchronized なメソッドを実行中にもその他のメソッドは実行されています。ってことはあるインスタンスのモニタを取得しても、他のメソッドは実行されるって事なんですね。

んでは、先ほどのメソッドを
    public void execute() {
 -> public synchronized void execute() {
に変更すると、
 Start.
 End.
 syncExecute実行中......
 syncExecute実行終了
 execute実行
となり、同時には実行されていないことがわかります。

まとめると、
 synchronizedメソッドはモニタをとらないと実行できない。
ってことですね。((すなわちあるインスタンスに対して、実行されているsynchronizedメソッドは一つである、か))







----
この記事は
#vote(おもしろかった[1],そうでもない[0])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS