`
real_junlin
  • 浏览: 18784 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

多线程题目

阅读更多

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

 

0
0
分享到:
评论
3 楼 real_junlin 2012-11-09  
城堡里的卡夫卡 写道
如果是只打印出step1,step2 不打印step3,实现倒是不难,起个线程把obj的对象锁占用就可以了,但是主线程会因为申请不到obj锁而阻塞,这是典型的死锁呀!有什么教育意义吗?

这道题的目的是为了考察对多线程机制的掌握情况,目的并不是为了产生死锁。
2 楼 城堡里的卡夫卡 2012-11-08  
如果是只打印出step1,step2 不打印step3,实现倒是不难,起个线程把obj的对象锁占用就可以了,但是主线程会因为申请不到obj锁而阻塞,这是典型的死锁呀!有什么教育意义吗?
1 楼 wwwcomy 2012-11-08  
static void magic1(final Object obj) throws Exception {
Thread t = new Thread() {
public void run() {
synchronized (obj) {
while (true) {
}
}
};
};
t.start();
t.join(1);
}

LZ锁太多我有点晕  不知道上面代码行不行。。

相关推荐

Global site tag (gtag.js) - Google Analytics