- 看到一個題目:針對下面的程序,寫出magic方法 讓整個程序只打印出step1,step2 不打印step3
public static void enter(Object obj) {
System.out.println("Step 1");
try {
magic1(obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Step 2");
synchronized (obj) {
System.out.println("Step 3 (never reached here)");
}
}
題目的意思很容易理解,可是要做出這道題目需要對多線程的基本改進非常的理解。
下面列出基本思路:
主線程想獲取obj的鎖,但是獲取不到,說明子線程始終在占據著這個對象的鎖。
同時主線程又能返回。
那現在就要實現讓子線程先跑,然后再喚醒主線程。這個顯然是鎖的占有和喚醒,那么問題來了,將什么做為這個鎖呢?如果是obj的話,不可能,因為子線程顯然不能在放掉obj.
那么只能是子線程自己的鎖。
下邊是程序
static void magic1(final Object obj) throws Exception{final Thread t = new Thread(){
public void run(){
synchronized(this){
synchronized(obj){
try {
notify();
join();
} catch (InterruptedException e) {
}
}
}
}
};
synchronized(t){
t.start();
t.wait();
}
}