- 看到一個(gè)題目:針對(duì)下面的程序,寫(xiě)出magic方法 讓整個(gè)程序只打印出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)");
}
}
題目的意思很容易理解,可是要做出這道題目需要對(duì)多線程的基本改進(jìn)非常的理解。
下面列出基本思路:
主線程想獲取obj的鎖,但是獲取不到,說(shuō)明子線程始終在占據(jù)著這個(gè)對(duì)象的鎖。
同時(shí)主線程又能返回。
那現(xiàn)在就要實(shí)現(xiàn)讓子線程先跑,然后再喚醒主線程。這個(gè)顯然是鎖的占有和喚醒,那么問(wèn)題來(lái)了,將什么做為這個(gè)鎖呢?如果是obj的話,不可能,因?yàn)樽泳€程顯然不能在放掉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();
}
}