- 追加された行はこの色です。
- 削除された行はこの色です。
#topicpath
----
#contents
なんとなく、後回しにしてきたマルチスレッドプログラミングなんですが、SWTの勉強などGUIプログラミングをやってると、どうしても知識が必要だなって思えてきまして、ちょっと勉強中です。
まだ全然わかってないんですが、いろいろメモ。
*** InterruptedException が発生するタイミング
途中。
*** 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 なメソッドを実行中にもその他のメソッドは実行されています。ってことはあるインスタンスのモニタを取得しても、「synchronizedでない」他のメソッドは実行されるって事なんですね。
んでは、先ほどのメソッドを
public void execute() {
-> public synchronized void execute() {
に変更すると、
Start.
End.
syncExecute実行中......
syncExecute実行終了
execute実行
となり、同時には実行されていないことがわかります。つまり、ある一時点で、実行されているsynchronized メソッドはひとつであるということが分かります((インスタンスごとですよ))。さらにThread#sleep()してもモニタは解放しないということも分かりました((解放するとしたら、sleepした瞬間別のメソッドが実行される))。
となり、同時には実行されていないことがわかります。つまり、ある一時点で、実行されているsynchronized メソッドはひとつであるということが分かります((インスタンスごとですよ))。さらにThread#sleep()してもモニタは解放しないということも分かりました((解放するとしたら、sleepした瞬間別のメソッドが実行される。逆にwait()メソッドの場合は、モニタは解放されます。))。
まとめると、
synchronizedメソッドはモニタをとらないと実行できない。
ってことですね((すなわちあるインスタンスに対して、実行されているsynchronizedメソッドは一つである、か))。なんだか当たり前の結論に行き着きました。。
----
この記事は
#vote(おもしろかった[1],そうでもない[0])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}