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); } }
相关推荐
在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...
5. **中断处理**:线程在等待时可能需要响应中断,`Thread.interrupt()`方法可以用来中断线程,而`wait()`方法会抛出`InterruptedException`,允许程序优雅地处理中断。 6. **哲学家就餐问题**:这是一个经典的多...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
1. **多线程编程**:NACHOS会使用多线程模拟并发执行的进程,因此理解Java中的Thread类和线程同步机制(如synchronized关键字,wait(),notify()和notifyAll()方法)是必要的。 2. **中断和调度**:Project1可能...
### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...
本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
在Java中,`wait()`, `notify()`, `notifyAll()`方法是`Object`类的成员,而不是`Thread`类的,这意味着任何对象都可以作为等待和通知的基础。 **1. 状态变量(State Variable)** 状态变量是线程间通信的关键。当...
这些题目反映了310-065考试的重点,包括但不限于:Java基础语法、异常处理、多线程编程(并发和同步)、对象监视器和wait/notify机制。考生在准备考试时,需要深入理解这些概念,并能够编写和分析实际的Java代码以...
### wait, notify等线程知识详解 #### 一、引言 在计算机程序设计中,尤其是在多线程环境中,线程间的同步与通信是保证程序正确性和效率的关键因素之一。`wait` 和 `notify` 是Java语言提供的原生方法,用于解决...
LockSupport允许先unpark再park,这与wait/notify方法不同,后者要求线程先wait之后才能被notify唤醒。如果在park之前执行了unpark,这不会产生负面影响,线程在调用park时将立即返回,不会进入等待状态。 ...
Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于...
本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...
在实际应用中,还需要考虑线程同步和通信问题,例如使用`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法来避免竞态条件和死锁。此外,`ExecutorService`和`Future`等高级API也提供了更强大的线程...
在给定的代码示例中,我们看到了一个模拟家庭共享同一银行账户的场景,通过使用Java多线程的wait()和notify()方法来控制不同线程(代表家庭成员)的操作顺序。这里涉及到的关键知识点包括: 1. **Java多线程**:...
Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及Lock接口(如ReentrantLock)等,防止多个线程同时访问共享资源,避免数据不一致。在批量数据查询中,可能需要同步...
`sleep()` 适用于需要让线程暂时退出执行的情况,`yield()` 用于尝试平衡多个线程的执行,而 `wait/notify/notifyAll()` 则用于线程间的协作,确保资源的有效共享。理解这些方法的差异和使用场景,能帮助开发者更好...
下面我们将深入探讨Java多线程的核心概念、同步机制、死锁问题以及wait/notify机制,以"生产者与消费者"的例子来具体阐述。 首先,了解Java中的线程。线程是操作系统分配CPU时间的基本单位,每个线程都有自己的程序...