Top / Java / スレッドプログラミング

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

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メソッドはモニタをとらないと実行できない。

ってことですね。*1


この記事は

選択肢 投票
おもしろかった 1  
そうでもない 0  

Top / Java / スレッドプログラミング

現在のアクセス:8923


*1 すなわちあるインスタンスに対して、実行されているsynchronizedメソッドは一つである、か

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