【问题标题】:Do code inside a synchronized block but after wait() runs in synchronized way?同步块内的代码是否在 wait() 之后以同步方式运行?
【发布时间】:2015-08-10 03:19:45
【问题描述】:

我想知道写在同步块中的代码,但是在 wait() 语句实际上是否以同步方式运行之后,因为在 wait() 期间,锁被放弃,一旦通知线程,它再次需要锁定。

public void process(){
    synchronized(sharedObj){
        try{
             sharedObj.wait();
        }catch(InterruptedException ex){
              ex.printStackTrace();
        }
        // when wait is over do the line below runs in synchronized way. It is inside synchronized block but during call of wait(), lock was relinquished. 
        sharedObj.writeValue();
    }
}

请帮我澄清我的疑问。

问候, 克里希纳

【问题讨论】:

    标签: java multithreading synchronization wait


    【解决方案1】:

    http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

    线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

    是的,它会恢复锁定。

    【讨论】:

      【解决方案2】:

      确实,一个线程要成功调用一个对象的wait() 方法,它必须持有该对象的监视器,并且它在wait() 的执行过程中放弃了监视器。然而,线程在从wait() 返回之前重新获取监视器也是如此。你不需要做任何特别的事情来实现它。

      也许你对执行wait()的线程在停止等待后可能需要与其他人竞争监视器这一事实感到困惑,但你不必担心;它发生在wait() 返回之前。同步块的完整性保持不变:始终可以确保在其中执行的代码没有其他线程持有同步对象的监视器,包括在执行 wait() 之后。

      【讨论】:

        【解决方案3】:

        根据Javadoc

        线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

        所以,是的,当wait 调用返回时,该线程将拥有监视器,这意味着它正在“以同步方式”运行(没有其他线程能够执行该代码块或任何其他块在当前线程离开synchronized 块之前使用相同的sharedObj 同步的代码)。

        顺便说一句,同样根据 Javadoc,wait 应始终在循环中调用,因为等待可能因其他原因而被中断,而不是您正在等待的 notify

        例如:

        public void process(){
            synchronized(sharedObj){
                while(!sharedObj.valueCanBeWritten()) {
                    try{
                        sharedObj.wait();
                    }catch(InterruptedException ex){
                      ex.printStackTrace();
                    }
                }
                sharedObj.writeValue();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多