- 追加された行はこの色です。
- 削除された行はこの色です。
#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(おもしろかった,そうでもない)
#vote(おもしろかった[1],そうでもない[0])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}