`
dacoolbaby
  • 浏览: 1267447 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java多线程同步代码块wait(),notify()和notifyAll()

    博客分类:
  • Java
阅读更多

一直对同步代码块和notify()不是很熟悉,后来做了个教程,总算是了解清楚了。

wait(),notify()和notifyAll() 其实是用于线程间的通信的。

 

Java有一个内建的等待机制来允许线程在等待信号的时候变为非运行状态。java.lang.Object 类定义了三个方法,wait()、notify()和notifyAll()来实现这个等待机制。

 

一个线程一旦调用了任意对象的wait()方法,就会变为非运行状态,直到另一个线程调用了同一个对象的notify()方法。为了调用wait()或者notify(),

线程必须先获得那个对象的锁。也就是说,线程必须在同步块里调用wait()或者notify()。

package io.study.example;

public class WaitAndNotify {

	class MonitorObject {

	}

	class TestThread1 implements Runnable {
		WaitNotifyObject object;

		TestThread1(WaitNotifyObject obj) {
			this.object = obj;
		}

		@Override
		public void run() {
			this.object.doWait();
		}
	}

	class TestThread2 implements Runnable {
		WaitNotifyObject object;

		TestThread2(WaitNotifyObject obj) {
			this.object = obj;
		}

		@Override
		public void run() {
			this.object.doNotify();
		}
	}

	class WaitNotifyObject {
		MonitorObject myMonitorObject = new MonitorObject();
		boolean wasSignalled = false; //避免假唤醒的情况

		public void doWait() {
			synchronized (myMonitorObject) {
				while(!wasSignalled){
					try {
						System.out.println("WaitNotifyObject wait!!");
						// 一个线程一旦调用了任意对象的wait()方法,就会变为非运行状态,直到另一个线程调用了同一个对象的notify()方法
						myMonitorObject.wait();
						
						//唤醒后会继续从wait()地方开始执行
						System.out.println("WaitNotifyObject wait over!!");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				wasSignalled = true;
			}
		}

		public void doNotify() {
			synchronized (myMonitorObject) {
				wasSignalled = true;
				System.out.println("WaitNotifyObject notify!!");
				myMonitorObject.notify();
			}
		}

	}

	public static void main(String[] args) throws InterruptedException {
		WaitAndNotify test = new WaitAndNotify();
		WaitNotifyObject obj = test.new WaitNotifyObject();
		Thread t1 = new Thread(test.new TestThread1(obj));
		Thread t2 = new Thread(test.new TestThread2(obj));
		
		t1.start();
		Thread.sleep(1000);
		t2.start();
		
		//synchronized(this) 表示监控调用方方法的本身
		
	}

}

 

其中看到代码中有一个wasSignalled变量。

这个变量用于阻止线程假启动的情况。

 

分享到:
评论

相关推荐

    Java 同步方式 wait和notify/notifyall

    总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    总之,Java多线程同步通过wait()、notify()和notifyAll()等方法,配合synchronized关键字,实现了对共享资源的访问控制,保证了程序的正确性。同时,原子操作和volatile关键字提供了更细粒度的线程安全保证。理解并...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    Java多线程中wait、notify、notifyAll使用详解

    Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...

    Java多线程wait和notify

    需要注意的是,`wait()`、`notify()` 和 `notifyAll()` 必须在同步块或同步方法中调用,以避免出现 `IllegalMonitorStateException`。此外,`InterruptedException` 在 `wait()` 中应该被妥善处理,通常是重新抛出或...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    Java 同步锁 wait notify 学习心得

    Java的`wait`和`notify`方法是实现线程间同步和通信的关键工具。正确使用这些方法可以有效避免线程间的死锁和资源浪费,同时保证多线程程序的正确性和性能。然而,使用这些方法时也需谨慎,不当的使用可能导致线程...

    Java多线程通讯之wait,notify的区别详解

    Java多线程通讯之wait、notify的区别详解 ...wait、notify和notifyAll方法是Java多线程通讯中非常重要的方法,它们用于控制线程的状态和同步。在多线程编程中,使用这些方法可以保证线程的安全性和高效性。

    Java多线程知识点总结

    在多线程编程中,线程间的同步和通信是需要特别注意的地方。Java提供了多种机制来保证线程安全,比如使用synchronized关键字来同步方法或代码块,实现线程之间的同步。当一个线程试图进入一个已经被另一个线程持有的...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1....

    java 多线程同步方法的实例

    在Java编程语言中,多线程同步是一种控制多个线程并发执行的重要机制,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。本文将深入探讨Java中的多线程同步方法,并通过实例来阐述其工作原理。 首先...

    Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)

    Java多线程基础中的线程等待与唤醒是一种常见的线程协作机制,通过wait()、notify()和notifyAll()方法来实现线程之间的同步和通信。在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 ...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    java多线程经典案例

    Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...

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

    综上所述,多线程同步和通讯是并发编程的核心部分。synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,...

    java多线程实例 代码可执行 绝对开源

    总的来说,这个"java多线程实例"是一个实用的学习资源,它展示了如何利用Java的多线程特性进行高效的网络下载,并通过合理的线程同步和文件操作来实现资源的合并。对于想要深入理解Java多线程和网络编程的开发者来说...

Global site tag (gtag.js) - Google Analytics