`

java线程同步原理及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()方法是随机唤醒一个沉睡线程。
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区别

    3(深入理解Wait、Notify和Wait与sleep区别).rar

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java线程状态流转图

    Java线程状态流转图中,以下方法与线程状态转换相关: * Object.wait():使线程从RUNNABLE状态转换到WAITING状态。 * Object.notify():使线程从WAITING状态转换到RUNNABLE状态。 * Object.notifyAll():使多个线程...

    java线程分析java project例子

    java线程分析java project例子,里面分析了sleep(),join(),yield()和wait以及notify等方法的使用以及需要注意的地方。

    线程学习小Test

    Java线程 wait notify sleep join 同步实现Demo

    java线程学习笔记

    3. Wait() 方法:使线程进入等待状态,释放锁资源,notify() 或 notifyAll() 唤醒线程,这三个方法必须在获得对象锁的状态下使用,否则报错。 4. IO 阻塞:线程因等待 IO 操作的完成而被阻塞。 线程优先级: 线程...

    Java多线程与并发系列22道高频面试题(附思维导图和答案解析)

    本文总结了Java多线程与并发系列的22道高频面试题,涵盖了多线程的实现方法、线程停止、notify和notifyAll的区别、sleep和wait的区别、volatile关键字的作用等多方面的知识点。 一、Java中实现多线程的方法 Java中...

    java多线程设计模式

    java多线程设计模式 线程的创建和重起 线程的同步 wait/notify/sleep机制 Worker Pattern

    Java编程详细教程Java线程PPT教案学习.pptx

    * start() 运行完毕线程调度阻塞事件解除阻塞TerminatedWaiting/Timed_Waitingwait()/sleep()notify() 或者 notifyAll()/ 时间到 * Thread.State 内部类中,定义了 6 种的线程状态: + BLOCKED + NEW + RUNNABLE ...

    Java高级工程师面试宝典

    Condition 的功能类似于在传统的线程技巧中使用 wait() 和 notify() 方法来实现线程之间的通信和同步。Condition 可以 êtreseen 作为一种高级的锁,它具有等待、通知和超时等机制,可以用来实现复杂的同步机制。

    Java面试-线程编程、Jsp、Servlet、Jdbc、Jdo、Xml方面.doc

    5. 线程同步的方法有wait()、sleep()、notify()、notifyAll()等。 6. 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。同步的实现方面有两种,分别是synchronized和wait与notify。 7. 线程的基本概念...

    多线程相关面试问题.docx

    wait()、notify() 和 notifyAll() 只能在同步控制方法或者同步控制块里面使用,而 sleep() 方法可以在任何地方使用。 五、如何保证线程安全? 线程安全是多线程编程中的一种非常重要的问题。保证线程安全的方式有...

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    Java并发编程面试题目

    Java中,wait()和notify()方法是线程通信的基本方法。wait()方法使得当前线程等待直到其他线程调用notify()方法,notify()方法唤醒正在等待的线程。sleep()方法和yield()方法是线程休眠和让步的方法。 Java中,...

    java笔试题大集合及答案(另附各大公司笔试题)

    60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...

    2020面试题总结多线程篇.pdf

    * sleep() 方法可以在任何地方使用,wait() 方法只能在同步方法和同步代码块中配合 synchronized 使用。 * sleep() 方法需要抛出异常,wait() 方法不需要。 五、sleep(0) 的意义 Thread.Sleep(0) 并非是真的要线程...

    Java中停止线程执行的方法

    一、暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法。对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式。或许有人会问,为什么不使用等待wait()或通知notify()?要...

    5-2_Java底层开发技术(Java高级).pdf

    Java 提供了多种线程操作方法,例如 wait() 方法使线程等待,notify() 方法唤醒等待线程,interrupt() 方法中断线程等。 同步与死锁是多线程中需要注意的两个问题。同步是指多个线程同时访问共享资源时,需要使用锁...

    java基础面试考察点.pdf

    wait() 和 notify(),wait 和 sleep 的区别。 4. ThreadLocal 的作用和实现机制;死锁的实现。 5. 实现一个线程池;IO 密集型和 CPU 密集型与线程池大小的关系。 JVM 相关知识点 1. Java 的类加载器体系结构和双亲...

Global site tag (gtag.js) - Google Analytics