- 看到一个题目:针对下面的程序,写出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();
}
}