`

wait-notify机制

阅读更多

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”之前,ABC线程应该都已运行至wait方法,即ABC线程都在wait通知队列,当主线程运行完lock.notifyAll();语句后,ABC线程对象都会从wait队列转入lock队列,接下来,ABC线程对象平等竞争锁资源,随机从lock队列中取出执行。

 

 

小结:

a.       如果两个或多个线程修改一个对象,请将执行修改的方法声明为synchronized方法。受到对象修改影响的只读方法也必须实现同步。

b.       如果一个线程必须等待某个对象的状态出现变更,那么它应该在对象的内部等待而不是在外面等待。这可以通过进入一个synchronized方法,并且调用wait方法来实现。

c.       不要在synchronized方法中花费大量的时间。大多数操作只是更新数据,然后很快返回。

d.       每当一个方法改变某个对象的状态时,它就应该调用notifyAll方法。这样可以给等待线程一个机会,以便查看环境有没有发生变化。

e.       记住,waitnotifyAll/notify方法都属于Object类的方法,而不是Thread类的方法。反复检查你对wait方法的调用与同一对象上的通知是否匹配。

  • 大小: 33.9 KB
分享到:
评论

相关推荐

    详解Java程序并发的Wait-Notify机制

    Java程序并发的Wait-Notify机制是Java多线程编程中的一种重要同步工具,它允许线程之间通过共享对象进行通信和协作。这个机制基于Java的内置锁(也称为监视器锁),通常与`synchronized`关键字一起使用。在Java中,`...

    多线程同步和通讯完整示例

    本文将深入探讨这些概念,以及如何使用synchronized关键字、wait-notify机制和Lock接口来实现线程间的同步与通讯。 首先,多线程是指在一个程序中同时运行多个独立的执行线程,每个线程都有自己的程序计数器、系统...

    java代码-wait-notify 生产者消费者

    `wait()`和`notify()`方法是Java中的内置锁机制,它们是`Object`类的方法,用于线程间的协作,以实现对共享资源的同步访问。 在"java代码-wait-notify 生产者消费者"的场景下,`wait()`方法让当前持有锁的线程暂停...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    38.线程间的通信-wait与notify-wait与notifty机制的实现.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    Java多线程wait和notify

    总结来说,Java的 `wait()` 和 `notify()` 提供了一种在多线程环境中控制线程执行的机制。通过合理使用这些方法,我们可以实现线程间的协作,精确控制子线程的运行状态。然而,这种方式虽然灵活,但管理起来相对复杂...

    浅谈java多线程wait,notify

    _java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地...

    移动通信软件编程基础JAVA语言.ppt

    Java提供了多种同步手段,如synchronized关键字用于同步方法或同步代码块,以及wait-notify机制,用于线程间的协作。死锁是多线程编程中需要避免的问题,它发生在两个或更多线程相互等待对方释放资源而造成的一种...

    Java多线程编程

    3. **wait-notify机制**:这是Java中实现线程间通信的一种方式。当一个线程调用`wait()`方法后,它会释放锁并进入等待状态,直到其他线程调用`notify()`或`notifyAll()`唤醒它。在案例中,当盘子满时,生产者线程会...

    深入理解Wait、Notify和Wait与sleep区别

    - **唤醒机制**:`wait()`需要其他线程调用`notify()`或`notifyAll()`来唤醒,而`sleep()`结束后会自动恢复执行。 - **唤醒策略**:`wait()`可能唤醒单个或所有等待线程,而`sleep()`结束后自动唤醒自身。 在实际...

    等待机制与锁机制wait notify

    本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...

    wait,notify等线程知识.pdf

    使用wait/notify机制时,需要注意死锁和活锁问题。死锁发生在两个或更多线程互相等待对方释放资源的情况下。活锁则是线程不断尝试获取资源但一直失败,导致无限期阻塞。合理设计同步策略和避免这些情况是多线程编程...

    37.线程间的通信-wait与notify-什么是等待和通知机制.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    多线程

    2. **线程深入wait-notify机制,线程池.pdf** 肯定会讨论Java中的对象监视器机制,如wait()、notify()和notifyAll()方法,以及线程池的使用,如ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor,...

    一个理解wait()与notify()的例子

    本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...

    java线程-保护性暂停(wait,notify实现).docx

    本文将详细讲解 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现。在 Java 中,线程之间的通信是一个非常重要的课题,而保护性暂停机制正是解决线程之间通信的关键所在。 首先,让我们来看一下上述场景...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

Global site tag (gtag.js) - Google Analytics