`
f543711700
  • 浏览: 325393 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

object.wait()和object.notify()和object.notifyall()

阅读更多
object.wait()方法:让拥有object对象的锁的线程进入等待状态,并释放对象锁。

object.wait()和object.notify()和object.notifyall()必须写在synchronized方法内部或者synchronized块内部,因为:

这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。。。

即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。如:
package com.wangf.test;

class AAA {
	
	public synchronized void aaa () throws InterruptedException {
		System.out.println(Thread.currentThread().getId());
	}
}

public class MyWait {

	public static void main(String[] args) throws InterruptedException {
		AAA aaa = new AAA();
		System.out.println(Thread.currentThread().getId());
		aaa.aaa();
		aaa.wait();
	}
}

main线程确实获得了对象aaa的锁,但是在main线程的上下文中写上aaa.wait() 仍然会抛出Exception in thread "main" java.lang.IllegalMonitorStateException

正确的应该这样:
package com.wangf.test;

class AAA {
	
	public synchronized void aaa() throws InterruptedException {
		System.out.println(Thread.currentThread().getId());
		this.wait();
	}
}

public class MyWait {

	public static void main(String[] args) throws InterruptedException {
		AAA aaa = new AAA();
		System.out.println(Thread.currentThread().getId());
		aaa.aaa();
	}
}
分享到:
评论

相关推荐

    Object.wait()与Object.notify()的用法详细解析

    总结一下,`Object.wait()`、`Object.notify()`和`Object.notifyAll()`是Java多线程编程中的关键工具,它们用于控制线程的同步和通信。使用时,必须确保在同步上下文中调用,否则会抛出异常。同时,合理运用这些方法...

    Java 同步方式 wait和notify/notifyall

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

    Java 中Object的wait() notify() notifyAll()方法使用

    在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者资源的一个代表)。在并发编程中,线程安全是非常重要的...

    java sleep和wait的解惑.docx

    `Object.wait()` 需要其他线程调用 `notify()` 或 `notifyAll()` 来恢复执行。 - **线程状态**:`Thread.sleep()` 导致线程进入 `BLOCKED` 状态;`Object.wait()` 导致线程进入等待队列。 #### 五、示例代码 以下...

    Monitor.wait例子.rar

    在多线程编程中,正确使用`wait()`, `notify()` 和 `notifyAll()` 能够帮助开发者创建复杂的并发控制机制,如生产者-消费者问题、读写锁等。然而,这些方法的使用需要特别小心,因为它们可能导致死锁、饥饿或者其他...

    Java多线程wait和notify

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

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

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

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

    wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...

    JVM线程分析.pdf

    4. in Object.wait()(在Object.wait()中):线程调用了`Object.wait()`方法后会进入此状态,等待其他线程调用相应对象的`notify()`或`notifyAll()`方法将其唤醒。 在Java中,Monitor是实现线程同步的关键机制。每...

    wait_notify_demo

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

    详解Java中的sleep()和wait()的区别

    3. **`Object.notify()` 和 `Object.notifyAll()`** - 这两个方法也是 `java.lang.Object` 类的实例方法,用于唤醒等待在该对象上的线程。`notify()` 只随机唤醒一个等待线程,而 `notifyAll()` 唤醒所有等待线程。...

    Java线程状态流转图

    * Object.notifyAll():使多个线程从WAITING状态转换到RUNNABLE状态。 * Thread.join():使线程从RUNNABLE状态转换到WAITING状态,直到join线程执行完毕。 * LockSupport.park():使线程从RUNNABLE状态转换到WAITING...

    java-wait和notify的用法.pdf

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

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

    本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...

    wait,notify等线程知识.pdf

    本文详细介绍了Java中线程同步的基本概念和技术,包括传统的 `wait` 和 `notify` 方法以及更高级的 `Lock` 接口和 `Condition` 接口。理解这些机制对于编写高效可靠的多线程应用程序至关重要。在实际应用中,应根据...

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

    - 调用`b.wait()`,这会让当前线程进入等待状态,直到另一个线程调用`b.notify()`或`b.notifyAll()`唤醒它。 - 输出完成后的总和。 - **`ThreadB`类**: - 继承自`Thread`类,重写了`run`方法。 - 在`run`方法...

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

    首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...

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

    值得注意的是,park和unpark不会释放锁资源,它们提供了一种比synchronized和Object.wait/notify更加灵活的线程控制方式。 使用LockSupport进行线程同步,与传统的wait/notify或者wait/notifyAll方法相比,提供了...

    等待机制与锁机制wait notify

    `wait()`、`notify()`和`notifyAll()`是Java `Object`类的三个方法,它们用于线程间的通信。这些方法必须在同步环境中(即synchronized方法或synchronized代码块)使用,否则会抛出`IllegalMonitorStateException`...

Global site tag (gtag.js) - Google Analytics