gpt4 book ai didi

java - 初学者关于Java多线程的问题以及synchronized block 和wait()/notify()的使用

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:23 25 4
gpt4 key购买 nike

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

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

  1. 处理与notify和wait通信的线程的Monitor和负责确保没有两个线程进入同步方法(get或put)的Monitor之间有区别吗?也就是说,当 put 方法内的一个线程调用 notification() 时,另一个正在等待进入 put 方法的线程是否是接管 Monitor 的有效候选者?

  2. 我的主要问题的答案是否如此“明显且愚蠢”,以至于当一个线程位于方法 put 的 wait() 内时,没有其他线程可以同时进入方法 put 和 get 来通知它,从而导致死锁发生?

  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);
    }

最佳答案

Is the answer to my main question so "obvious and dumb" that while one thread is inside wait() of the method put, no other thread can enter both method put and get to notify it which makes the deadlock happen?

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

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

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

关于java - 初学者关于Java多线程的问题以及synchronized block 和wait()/notify()的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com