`

Thread-wait/notify

阅读更多

java 线程通过对象的Wait和Notify进行同步,但是存在一定的危险性

其重点是:wait 和 notify 的 时间点

举例:

package com.horizon.thread.aqs;

public class NotSafeWaitNotify {

	private static StringBuffer lock = new StringBuffer();

	public static void main(String[] args) throws Exception {
		// testWaitAfterNotify();
		//testWaitBeforeNotify();
		testWaitAfterNotifyV2();
	}

	/**
	 * 先notify 后wait,不能正常工作
	 */
	private static void testWaitAfterNotify() throws Exception {
		Thread modifyThread = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				synchronized (lock) {
					lock.append("1000");
					lock.notify();
				}
			}
		};

		modifyThread.start();

		Thread.sleep(2000);
		synchronized (lock) {
			lock.wait();
		}

		System.out.println(lock);

	}

	/**
	 * 先notify 后wait,不能正常工作 
	 * 改进思路:先判断是否已经有结果
	 */
	private static void testWaitAfterNotifyV2() throws Exception {
		Thread modifyThread = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				synchronized (lock) {
					lock.append("1000");
					lock.notify();
				}
			}
		};

		modifyThread.start();

		Thread.sleep(2000);
		synchronized (lock) {
			//先判断是否已经有结果
			if (lock.length() < 0) {
				lock.wait();
			}
		}

		System.out.println(lock);

	}

	/**
	 * 先wait 后notify,正常工作
	 */
	private static void testWaitBeforeNotify() throws Exception {
		Thread modifyThread = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				synchronized (lock) {
					lock.append("1000");
					lock.notify();
				}
			}
		};

		modifyThread.start();

		synchronized (lock) {
			lock.wait();
		}

		System.out.println(lock);

	}
}

 

0
1
分享到:
评论

相关推荐

    java-wait和notify的用法.pdf

    在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...

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

    5. **中断处理**:线程在等待时可能需要响应中断,`Thread.interrupt()`方法可以用来中断线程,而`wait()`方法会抛出`InterruptedException`,允许程序优雅地处理中断。 6. **哲学家就餐问题**:这是一个经典的多...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    nachos-java及project1完整代码

    1. **多线程编程**:NACHOS会使用多线程模拟并发执行的进程,因此理解Java中的Thread类和线程同步机制(如synchronized关键字,wait(),notify()和notifyAll()方法)是必要的。 2. **中断和调度**:Project1可能...

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

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

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

    本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

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

    在Java中,`wait()`, `notify()`, `notifyAll()`方法是`Object`类的成员,而不是`Thread`类的,这意味着任何对象都可以作为等待和通知的基础。 **1. 状态变量(State Variable)** 状态变量是线程间通信的关键。当...

    Sun Certified Programmer for the Java 2 Platform(310-065)

    这些题目反映了310-065考试的重点,包括但不限于:Java基础语法、异常处理、多线程编程(并发和同步)、对象监视器和wait/notify机制。考生在准备考试时,需要深入理解这些概念,并能够编写和分析实际的Java代码以...

    wait,notify等线程知识.pdf

    ### wait, notify等线程知识详解 #### 一、引言 在计算机程序设计中,尤其是在多线程环境中,线程间的同步与通信是保证程序正确性和效率的关键因素之一。`wait` 和 `notify` 是Java语言提供的原生方法,用于解决...

    Java 多线程与并发(9-26)-JUC锁- LockSupport详解.pdf

    LockSupport允许先unpark再park,这与wait/notify方法不同,后者要求线程先wait之后才能被notify唤醒。如果在park之前执行了unpark,这不会产生负面影响,线程在调用park时将立即返回,不会进入等待状态。 ...

    Object类wait及notify方法原理实例解析

    Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于...

    等待机制与锁机制wait notify

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

    thread-use-demo.rar_DEMO

    在实际应用中,还需要考虑线程同步和通信问题,例如使用`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法来避免竞态条件和死锁。此外,`ExecutorService`和`Future`等高级API也提供了更强大的线程...

    一家三口共用同一账户银行卡,wait();notify();

    在给定的代码示例中,我们看到了一个模拟家庭共享同一银行账户的场景,通过使用Java多线程的wait()和notify()方法来控制不同线程(代表家庭成员)的操作顺序。这里涉及到的关键知识点包括: 1. **Java多线程**:...

    thread-multi.zip

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及Lock接口(如ReentrantLock)等,防止多个线程同时访问共享资源,避免数据不一致。在批量数据查询中,可能需要同步...

    多线程sleep,yield,wait区别

    `sleep()` 适用于需要让线程暂时退出执行的情况,`yield()` 用于尝试平衡多个线程的执行,而 `wait/notify/notifyAll()` 则用于线程间的协作,确保资源的有效共享。理解这些方法的差异和使用场景,能帮助开发者更好...

    Java多线程管理示例

    下面我们将深入探讨Java多线程的核心概念、同步机制、死锁问题以及wait/notify机制,以"生产者与消费者"的例子来具体阐述。 首先,了解Java中的线程。线程是操作系统分配CPU时间的基本单位,每个线程都有自己的程序...

Global site tag (gtag.js) - Google Analytics