多线程题目

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值