`

wait,notify的用法及与sleep的区别

阅读更多

一。 Java线程同步原理

 

        java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronized methods )或同步快被多个线程调用时,该对象的monitor将负责处理这些访问的并发独占要求。
当 一个线程调用一个对象的同步方法时,JVM会检查该对象的monitor。如果monitor没有被占用,那么这个线程就得到了monitor的占有权, 可以继续执行该对象的同步方法;如果monitor被其他线程所占用,那么该线程将被挂起,直到monitor被释放。
当线程退出同步方法调用时,该线程会释放monitor,这将允许其他等待的线程获得monitor以使对同步方法的调用执行下去。
注意:java对象的monitor机制和传统的临界检查代码区技术不一样。java的一个类一个同步方法并不意味着同时只有一个线程独占执行(不同对象的同步方法可以同时执行),但临界检查代码区技术确会保证同步方法在一个时刻只被一个线程独占执行。

 

java的monitor机制的准确含义是:任何时刻,对一个指定object对象的某同步方法只能由一个线程来调用。
java对象的monitor是跟随object实例来使用的,而不是跟随程序代码。两个线程可以同时执行相同的同步方法,比如:一个类的同步方法是xMethod(),有a,b两个对象实例,一个线程执行a.xMethod(),另一个线程执行b.xMethod(). 互不冲突。

 

二。 wait()、notify(),notifyAll()的使用
          obj.wait()方法使本线程挂起,并释放obj对象的monitor,只有其他线程调用obj对象的notify()或notifyAll()时,才可以被唤醒。
obj.notifyAll()方法唤醒所有阻塞在obj对象上的沉睡线程,然后被唤醒的众多线程竞争obj对象的monitor占有权,最终得到的那个线程会继续执行下去,但其他线程继续等待。
obj.notify()方法是随机唤醒一个沉睡线程,过程更obj.notifyAll()方法类似。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,
如:
synchronized(x){
x.notify()
//或者wait()
}
以上内容说明了为什么调用wait(),notify(),notifyAll()的线程必须要拥有obj实例对象的monitor占有权。
每个对象实例都有一个等待线程队列。这些线程都是等待对该对象的同步方法的调用许可。对一个线程来说,有两种方法可以进入这个等待线程队列。一个是当其他线程执行同步方法时,自身同时也要执行该同步方法;另一个是调用obj.wait()方法。
当同步方法执行完毕或者执行wait()时,其他某个线程将获得对象的访问权。当一个线程被放入等待队列时,必须要确保可以通过notify()的调用来解冻该线程,以使其能够继续执行下去。

三。 wait()与sleep()的区别
sleep()方法是Thread类的静态方法,不涉及到线程间同步概念,仅仅为了让一个线程自身获得一段沉睡时间。sleep可以在任何地方使用。
wait()方法是object类的方法,解决的问题是线程间的同步,该过程包含了同步锁的获取和释放,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify()方法才会重新激活调用者。
注意:线程调用notify()之后,只有该线程完全从 synchronized代码里面执行完毕后,monitor才会被释放,被唤醒线程才可以真正得到执行权。

分享到:
评论

相关推荐

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

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

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

    wait方法与sleep和suspend方法的主要区别在于,wait方法可以释放锁,而sleep和suspend方法不能释放锁。wait方法可以让当前线程暂时放弃对象锁,让其他线程使用,而sleep和suspend方法不能做到这一点。 结论 在Java...

    sleep() 方法和wait()方法的区别.docx

    sleep() 方法和 wait() 方法的区别 sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,...

    Java多线程wait和notify

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

    多线程sleep,yield,wait区别

    - `wait()` 会抛出 `InterruptedException`,与 `sleep()` 类似,需要妥善处理。 - `notify()` 仅唤醒一个等待该对象的线程,而 `notifyAll()` 唤醒所有等待的线程。 - 在使用这些方法时,必须确保线程已经获得了...

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

    #### `wait()`与`suspend()`/`sleep()`的区别 `wait()`、`suspend()`以及`sleep()`都可以让线程暂停执行,但它们之间存在显著差异: - **`suspend()`**:已废弃,它会使线程暂停并保持锁的持有权,导致死锁风险...

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

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

    java sleep()和wait()

    ### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...

    C#中sleep和wait的区别分析

    `Sleep` 和 `Wait` 是两个常用的方法,它们都可以让线程暂停执行,但它们的使用场景和机制有着本质的区别。 首先,`Sleep` 方法是定义在 `System.Threading.Thread` 类中的,它允许程序员指定一个时间段,在这个...

    详解Java中wait和sleep的区别

    例如,在一个生产者-消费者模型中,我们可以使用wait()方法来实现生产者和消费者之间的同步,而使用sleep()方法来控制生产者和消费者的执行时间。 此外,我们还需要注意wait()和sleep()方法的唤醒机制。...

    Sleep和Wait的区别.pdf

    ### Sleep与Wait的区别详解 #### 一、基本概念 在多线程编程中,`sleep`和`wait`是两个非常重要的方法,用于控制线程的执行和协调多个线程之间的交互。理解这两个方法的不同之处对于正确实现多线程程序至关重要。 ...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    3. **调用位置**:`wait()`, `notify()`和`notifyAll()`必须在同步环境中(同步方法或同步代码块)调用,而`sleep()`可以在任何地方调用。 4. **异常处理**:`sleep()`方法需要捕获`InterruptedException`,而`wait...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    public class ThreadWaitNotify { public static void main(String[] args) throws InterruptedException { DemoTest demoTest = new DemoTest(); // 使用线程池异步执行waitTest方法 ExecutorService ...

    wait和sleep的区别.pdf

    流媒体知识核心概念中提到的视频封装格式和视频压缩编码标准,以及wait和sleep的区别,以下是相关的知识点: 首先,视频封装格式和视频压缩编码标准是构建流媒体技术的两大核心组件。 视频封装格式是一种存储视频...

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

    在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...

    JAVA线程sleep()和wait()详解及实例

    JAVA线程sleep()和wait()详解及实例 JAVA线程sleep()和wait()是两个常用的线程控制方法,用于控制线程的执行和同步。本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地...

    java sleep和wait的解惑.docx

    ### Java中的sleep与wait详解 #### 一、概述 在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这...

    java中yieldsleep以及wait的区别.pdf

    Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...

    Java多线程通信wait()和notify()代码实例

    在Java中,多线程通信主要通过wait()和notify()方法实现,下面将详细介绍wait()和notify()方法的使用和机理。 wait()方法: wait()方法是Object类中的一个方法,它使当前线程等待,直到其他线程调用该对象的notify...

    线程中sleep、join、yield、wait的区别

    本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...

Global site tag (gtag.js) - Google Analytics