java黑皮书30.8

(帐户同步)使用对象的wait()和notify Al1C方法重写清单30.6,thread co operation java。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    使用对象的wait()和notifyAll()方法实现线程同步的步骤如下:

    1. 确保所有线程都在同一个对象上同步,即使用同步代码块或同步方法,并且在同步块中调用wait()和notifyAll()方法。

    2. 确保线程在调用wait()方法前持有对象的monitor,否则会抛出IllegalMonitorStateException异常。

    3. 调用wait()方法后,线程会释放对象的monitor并进入wait set队列中等待被唤醒。

    4. 调用notifyAll()方法可以唤醒所有在wait set队列中等待的线程,notify()方法只能唤醒其中一个线程,并且是随机的。

    5. 唤醒线程的前提是持有对象的monitor,因此唤醒线程的代码需要在synchronized块中执行。

    6. 在唤醒线程之后,等待线程需要重新竞争对象的monitor,只有获得monitor的线程才能继续执行。

    示例代码如下:

    public class SyncExample {
        private final Object lock = new Object();
        private boolean isReady = false;
    
        public void producer() {
            synchronized (lock) {
                // 生产者线程生产数据
                isReady = true;
                // 通知所有等待的消费者线程
                lock.notifyAll();
            }
        }
    
        public void consumer() {
            synchronized (lock) {
                while (!isReady) {
                    try {
                        // 等待生产者线程生产数据
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 消费者线程消费数据
                isReady = false;
            }
        }
    }
    

    注:上面的示例代码中只有单个生产者和单个消费者线程,如果有多个生产者和消费者线程时,需要使用while循环来防止虚假唤醒。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^