同じタスクとオブジェクトロックの問題
たまにjavaプログラミングの思想を開いてマルチスレッドの章を見て、焦りが突然ある問題に引っかかって動かなくなった.この問題は何度も何度も見て、今やっと理解して、急に自分が不器用な思考だと感じました.
問題は、一般的に、マルチスレッド・プログラムでは、あるタスクがオブジェクトのロックを持ってからタスクを実行することができ、他のタスクは、そのタスクが同じオブジェクトのロックを解放してからオブジェクトのロックを持ってからタスクを実行することができます.そこで,同じタスクが同じオブジェクトのロックを保持した後,ロックを解放せずに同じオブジェクトの他の同期(synchronized)メソッドを呼び出し続け,そのタスクが再びそのオブジェクトロックを保持するかどうかを考える.
答えは肯定的だ.
同じタスクが同じオブジェクト上の他のsynchronizedメソッドを呼び出すと、オブジェクトロックが再び取得されます.
マルチスレッドプログラミングは微妙なことで、ここで人を試すのは大局ではなく細部、細部の細部です.自分の愚かな思考を呼び覚ますことを望んでいます.
問題は、一般的に、マルチスレッド・プログラムでは、あるタスクがオブジェクトのロックを持ってからタスクを実行することができ、他のタスクは、そのタスクが同じオブジェクトのロックを解放してからオブジェクトのロックを持ってからタスクを実行することができます.そこで,同じタスクが同じオブジェクトのロックを保持した後,ロックを解放せずに同じオブジェクトの他の同期(synchronized)メソッドを呼び出し続け,そのタスクが再びそのオブジェクトロックを保持するかどうかを考える.
答えは肯定的だ.
同じタスクが同じオブジェクト上の他のsynchronizedメソッドを呼び出すと、オブジェクトロックが再び取得されます.
マルチスレッドプログラミングは微妙なことで、ここで人を試すのは大局ではなく細部、細部の細部です.自分の愚かな思考を呼び覚ますことを望んでいます.
package thread.thread1;
/**
* create on 2010.08.04 08:27
*
* @since jdk1.6
* @author maozj
* @version 1.0
*
*/
public class SynchronizedClassHolder {
/**
* Test client
* @param args
*/
public static void main(String[] args) {
new Thread() {
public void run() {
new SynchronizedClassHolder().f1();
}
}.start();
}
private static int count = 10;
/**
* synchronized f1()
*/
public synchronized void f1() {
if (--count > 0) {
System.out.println("f1() calling f2() count " + count);
f2();
}
}
/**
* synchronized f2()
*/
public synchronized void f2() {
if (--count > 0) {
System.out.println("f2() calling f1() count " + count);
f1();
}
}
}
:
f1() calling f2() count 9
f2() calling f1() count 8
f1() calling f2() count 7
f2() calling f1() count 6
f1() calling f2() count 5
f2() calling f1() count 4
f1() calling f2() count 3
f2() calling f1() count 2
f1() calling f2() count 1