wait-notify机制
a. 当synchronized方法中的wait方法被调用时,当前线程将被中断运行,并且放弃该对象的锁
b. 一旦线程调用了wait方法,它便进入该对象的等待列表。要从等待列表中删除该线程,使它有机会继续运行,其它线程必须调用同一个对象上的notify或者notifyAll方法
c. 当线程再次成为可运行的线程后,它们便试图重新进入该对象。一旦可以使用该对象锁时,其中的一个线程将锁定该对象,并且从它上次调用wait方法后的位置开始继续运行
实例:
package com.bijian.thread; public class MyThread extends Thread { private Object o; MyThread(Object o) { this.o = o; } public void run() { synchronized (o) { try { System.out.println(getName() + " before wait"); o.wait(); System.out.println(getName() + " after wait"); } catch (InterruptedException e) { } } } }
package com.bijian.thread; public class WaitNotifyAllDemo { public static void main(String[] args) { Object lock = new Object(); MyThread mt1 = new MyThread(lock); mt1.setName("A"); MyThread mt2 = new MyThread(lock); mt2.setName("B"); MyThread mt3 = new MyThread(lock); mt3.setName("C"); mt1.start(); mt2.start(); mt3.start(); System.out.println("main thread sleeping"); try { Thread.sleep(3000); } catch (InterruptedException e) { } System.out.println("main thread awake"); synchronized (lock) { lock.notifyAll(); } } }
运行结果:
A before wait main thread sleeping B before wait C before wait main thread awake C after wait B after wait A after wait
实例分析:主线程在打印出“main thread awake”之前,A、B、C线程应该都已运行至wait方法,即A、B、C线程都在wait通知队列,当主线程运行完lock.notifyAll();语句后,A、B、C线程对象都会从wait队列转入lock队列,接下来,A、B、C线程对象平等竞争锁资源,随机从lock队列中取出执行。
小结:
a. 如果两个或多个线程修改一个对象,请将执行修改的方法声明为synchronized方法。受到对象修改影响的只读方法也必须实现同步。
b. 如果一个线程必须等待某个对象的状态出现变更,那么它应该在对象的内部等待而不是在外面等待。这可以通过进入一个synchronized方法,并且调用wait方法来实现。
c. 不要在synchronized方法中花费大量的时间。大多数操作只是更新数据,然后很快返回。
d. 每当一个方法改变某个对象的状态时,它就应该调用notifyAll方法。这样可以给等待线程一个机会,以便查看环境有没有发生变化。
e. 记住,wait和notifyAll/notify方法都属于Object类的方法,而不是Thread类的方法。反复检查你对wait方法的调用与同一对象上的通知是否匹配。
相关推荐
Java程序并发的Wait-Notify机制是Java多线程编程中的一种重要同步工具,它允许线程之间通过共享对象进行通信和协作。这个机制基于Java的内置锁(也称为监视器锁),通常与`synchronized`关键字一起使用。在Java中,`...
本文将深入探讨这些概念,以及如何使用synchronized关键字、wait-notify机制和Lock接口来实现线程间的同步与通讯。 首先,多线程是指在一个程序中同时运行多个独立的执行线程,每个线程都有自己的程序计数器、系统...
`wait()`和`notify()`方法是Java中的内置锁机制,它们是`Object`类的方法,用于线程间的协作,以实现对共享资源的同步访问。 在"java代码-wait-notify 生产者消费者"的场景下,`wait()`方法让当前持有锁的线程暂停...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
总结来说,Java的 `wait()` 和 `notify()` 提供了一种在多线程环境中控制线程执行的机制。通过合理使用这些方法,我们可以实现线程间的协作,精确控制子线程的运行状态。然而,这种方式虽然灵活,但管理起来相对复杂...
_java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地...
Java提供了多种同步手段,如synchronized关键字用于同步方法或同步代码块,以及wait-notify机制,用于线程间的协作。死锁是多线程编程中需要避免的问题,它发生在两个或更多线程相互等待对方释放资源而造成的一种...
3. **wait-notify机制**:这是Java中实现线程间通信的一种方式。当一个线程调用`wait()`方法后,它会释放锁并进入等待状态,直到其他线程调用`notify()`或`notifyAll()`唤醒它。在案例中,当盘子满时,生产者线程会...
- **唤醒机制**:`wait()`需要其他线程调用`notify()`或`notifyAll()`来唤醒,而`sleep()`结束后会自动恢复执行。 - **唤醒策略**:`wait()`可能唤醒单个或所有等待线程,而`sleep()`结束后自动唤醒自身。 在实际...
本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...
使用wait/notify机制时,需要注意死锁和活锁问题。死锁发生在两个或更多线程互相等待对方释放资源的情况下。活锁则是线程不断尝试获取资源但一直失败,导致无限期阻塞。合理设计同步策略和避免这些情况是多线程编程...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
2. **线程深入wait-notify机制,线程池.pdf** 肯定会讨论Java中的对象监视器机制,如wait()、notify()和notifyAll()方法,以及线程池的使用,如ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor,...
本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...
本文将详细讲解 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现。在 Java 中,线程之间的通信是一个非常重要的课题,而保护性暂停机制正是解决线程之间通信的关键所在。 首先,让我们来看一下上述场景...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...