`

为什么wait 和notifyAll 必须要使用synchronized?

阅读更多

    为什么wait 和notifyAll(notify) 必须要使用synchronized?

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

 

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

 

synchronized fun(){
    this.wait();
}

  

    如果不用在synchronized里面就会报错:

java.lang.IllegalMonitorStateException

       首先明确wait 和notifyAll是基于对象而存在的。wait等待的就是一个对象发出的信号。

       既然基于对象,因此需要一个数据结构来存放这些等待的线程,而且这个数据结构应当与这个对象绑定,此时在这个对象上面可能有多个线程调用wait/notifyAll方法。

       在向这个数据结构上面写入,删除数据时,依然存在并发问题,理论上也需要一个锁来控制。在JVM中是通过检查当前线程是否为对象的OWNER来判定是否要抛出相应的异常,由此可见他希望该动作由Java程序抽象层来控制。

 

 

分享到:
评论

相关推荐

    wait和notifyAll方法的使用示例

    ### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...

    Java 同步方式 wait和notify/notifyall

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

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

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

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

    为什么wait()和notify()必须和synchronized一起使用 当不在synchronized同步块中使用wait()和notify()或者调用方法的对象不是synchronized的同步锁就会抛异常:java.lang.IllegalMonitorStateException。很多人会...

    Java的wait(), notify()和notifyAll()使用心得

    1. **锁的持有**:调用`wait()`, `notify()`, 或 `notifyAll()` 必须在同步块(`synchronized` block)或同步方法中进行,即当前线程必须持有对象的锁。否则,会抛出`IllegalMonitorStateException`异常。这是因为这些...

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

    下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动释放占有的对象锁,并等待notify。该方法的调用必须在synchronized代码块或者方法中,因为wait()方法需要当前线程必须获得...

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

    - 使用wait()时,必须在同步代码块(由synchronized修饰的方法或代码块)中调用,因为只有持有锁的线程才能调用wait()。 - 恢复执行的线程会从wait()调用后的下一条语句开始,因此通常在循环中调用wait(),以确保...

    Java通过wait()和notifyAll()方法实现线程间通信

    本篇将详细介绍如何使用`wait()`和`notifyAll()`方法实现线程间的通信,并结合给定的代码实例进行分析。 1. **`wait()`方法**: 当一个线程调用对象的`wait()`方法时,该线程会释放当前对象的锁,并进入等待状态。...

    synchronized用法大全实例

    `synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...

    synchronized 的理解

    下面,我们将从`synchronized`的基本概念、使用方式以及与`wait`和`notify`方法的关系几个方面进行详细阐述。 ### 一、`synchronized`关键字的基本概念 `synchronized`是Java语言中提供的关键字,用于控制线程的...

    synchronized并发讲解源码.zip

    除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...

    java synchronized详解

    通过`wait()`、`notify()`和`notifyAll()`方法,线程可以在同步块中进行等待和唤醒操作。这些方法必须在`synchronized`代码块或方法中调用,否则会抛出`IllegalMonitorStateException`。 9. **Lock接口与`...

    Java 同步锁 wait notify 学习心得

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

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    面试官:你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

    在实际编程中,`wait()`、`notify()`和`notifyAll()`通常与生产者消费者模型、条件变量等并发设计模式相结合使用。它们是Java并发库的基础,理解其工作原理和使用方式对于编写高性能、高并发的Java应用程序至关重要...

    生产者消费者Java—synchronized 机制

    然而,这个项目可能仅使用了`synchronized`和`wait/notify`,因为这是基础的并发控制手段。 4. **设计模式**:生产者消费者模型属于行为设计模式,它帮助我们在多线程环境中协调生产者和消费者的活动,避免资源过度...

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    在Java并发编程中,理解和熟练使用同步机制是至关重要的,这包括了`ReentrantLock`和`synchronized`关键字。这两个工具都是为了确保多线程环境中的数据一致性与安全性,防止出现竞态条件和死锁等问题。 `...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要...此外,`wait()`方法的使用总是伴随着`synchronized`块或方法,确保了锁的正确管理和释放,从而保障了多线程程序的正确性和稳定性。

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

    wait和notify的使用 在上面的代码中,我们可以看到,ThreadA类中的main方法调用了ThreadB类的实例,并启动了它。然后,main方法调用wait方法,进入等待状态,直到ThreadB类的实例调用notify方法来唤醒它。在ThreadB...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...

Global site tag (gtag.js) - Google Analytics