本帖最后由 jiangpan007 于 2014-12-02 11:14:52 编辑

解决方案 »

  1.   

    test1 wait后释放了对象锁,test2得到对象锁,test2 wait又释放了,然后test1 print ,然后test2 print
      

  2.   

    楼主对 wait理解错了。wait的时候,锁是释放的状态。
      

  3.   

    thread test1 get the lock
    thread test2 get the lock
    程序打印出这两句很快的,执行wait(1000)并不会立即释放对象锁,而是要等同步块执行完后再释放,我理解不了你的说法。能分析下执行顺序吗
      

  4.   

    希望楼主发代码的时候能够将其格式转换为java格式,不然这样格式的代码看着就不舒服,别人怎么会耐心给你解答呢,just suggestion
      

  5.   

    调用wait方法会堵塞当前线程是吧,如果2个线程都释放了对象锁,又都没能notify,这是不是死锁。
    我把代码改成下面这样,不指定wait时间,运行程序后程序一直运行,并且永远没执行到打印running这行代码。public void run() {
    synchronized(objectlock){
    // TODO Auto-generated method stub
    try {
    System.out.println(name+" get the lock");
    objectlock.wait();
    System.out.println(name+" running.......");
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    finally{
    objectlock.notify();
    }
    }
    }
      

  6.   

    还想问个问题,objectlock.wait(2000)执行后,当前线程(线程A)挂起,等2000毫秒会尝试获取对象锁吧,如果还没有到达2000毫米,另一线程(线程B)执行notify,线程A是立即获得对象锁吗,还是必须等待2000毫秒后才获得对象锁;另外我测试,假如线程A挂起200毫秒,B线程先sleep 1000毫秒再释放对象锁,线程A会再1000毫秒后获得对象锁,是不是可以这样理解,当200毫秒后,线程A就一直尝试获得对象锁,直到线程B释放对象锁。
      

  7.   


    不是。是立即释放对象锁,然后处于等待状态2000毫秒,时间到了,结束这个等待状态,然后试图再尝试获取锁,以便继续执行wait之后的语句。