初学者关于Java中的多线程和同步块的使用以及wait()/ notify()的问题

时间:2017-04-11 21:30:58

标签: java multithreading wait synchronized notify

我正在学习Java中的同步机制。这是我分析的示例代码。对于丢失的代码感到抱歉,但故事很简单。我们有2个消费者和4个生产者,他们被实现为Threads,他们分别在while循环中调用这些get和put方法。

问题是为什么我们陷入僵局? 另外,如果你能在我的脑海里回答我的一些问题。

  1. 处理与notify和wait通信的线程的Monitor与监视没有两个线程进入同步方法(获取或放置)的Monitor之间是否存在差异?也就是说,当put方法中的一个线程调用notify()时,另一个等待进入put方法的线程是一个有效的候选者来接管Monitor吗?

  2. 我的主要问题的答案是如此“明显和愚蠢”,当一个线程在方法put的wait()内,没有其他线程可以输入两个方法put并获取通知它导致死锁发生?

  3. notify和notifyAll有什么区别?

    public synchronized void put(Object o) throws InterruptedException {
        while (count == size) {
            wait();
        }
        buf[in] = o;
        //System.out.println("PUT from " + Thread.currentThread().getName());
        ++count;
        in = (in + 1) % size;
        notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
      }
    
    public synchronized Object get() throws InterruptedException {
       while (count == 0) {
           wait();
       }
       Object o = buf[out];
       buf[out] = null;
       //System.out.println("GET from " + Thread.currentThread().getName());
       --count;
       out = (out + 1) % size;
       notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
       return (o);
    }
    

1 个答案:

答案 0 :(得分:0)

  

我的主要问题的答案是否明显而且愚蠢"虽然一个线程在方法put的wait()内,没有其他线程可以输入两个方法put并获取通知它会导致死锁发生?

o.wait()执行一系列步骤:

  • 它会释放o
  • 上的锁定
  • 等待另一个线程调用o.notify()
  • 等待锁定再次可用,
  • 重新锁定锁,最后
  • 它返回。

因此当一个线程在wait()调用中进行put(o)调用时,另一个线程可以在get()put()调用内执行。