#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;}