当一个线程进入了synchronized方法,在这个方法的某一步调用了wait方法,然后当这个线程再次被唤醒的时候,它是继续从wait的地方开始执行,还是从这个synchronized方法入口开始执行?

解决方案 »

  1.   

    因为wait是释放锁的,所以这条线程被唤醒的时候,还需要进行锁的抢夺,所以是在synchronized这个地方,在等待锁,拿到锁之后才会继续执行下去
      

  2.   

    假设被synchronized的是一个方法,某个线程调用wait方法释放了锁,当这个线程再次获得锁之后,会重新从这个方法入口执行?
      

  3.   

    wait让出同步锁,线程等待,nofity唤醒线程,重新加入锁的竞争
      

  4.   

    其实我疑惑的是,wait的线程被再次唤醒后,wait前面的代码还会不会执行。
      

  5.   

    其实我疑惑的是,wait的线程被再次唤醒后,wait前面的代码还会不会执行。肯定会啊,如果抢到锁,重新进入锁住的那部分代码执行
      

  6.   

    自己试一下更容易记住。
    答案当然是不会重新执行原来已经执行过的的代码了,每个线程都有一个指令程序计数器,当执行完某一个指令,cpu时间片切换到另一个线程执行,下次再切回到原来的线程时接着原来的指令执行.wait和notify是同样的效果.
      

  7.   

    从wait的地方开始执行。
    就像一个人走路,走到一个地方,停住了(wait),等别人通知他能走了,当然从停下来的地方继续走,才符合常理。
      

  8.   

    其实我疑惑的是,wait的线程被再次唤醒后,wait前面的代码还会不会执行。肯定会啊,如果抢到锁,重新进入锁住的那部分代码执行
    那岂不是wait语句之前都不能写会改变某些对象的状态的代码。
      

  9.   

    其实我疑惑的是,wait的线程被再次唤醒后,wait前面的代码还会不会执行。肯定会啊,如果抢到锁,重新进入锁住的那部分代码执行
    那岂不是wait语句之前都不能写会改变某些对象的状态的代码。不好意思。。搞错了,被唤醒并且被执行的线程是从上次阻塞的位置从下开始运行,也就是从wait()方法后开始执行
      

  10.   

    写了一个测试代码,证明两位说的是对的,thanks.
      

  11.   

    其实我疑惑的是,wait的线程被再次唤醒后,wait前面的代码还会不会执行。肯定会啊,如果抢到锁,重新进入锁住的那部分代码执行
    那岂不是wait语句之前都不能写会改变某些对象的状态的代码。不好意思。。搞错了,被唤醒并且被执行的线程是从上次阻塞的位置从下开始运行,也就是从wait()方法后开始执行
    共勉