wait() 与 notify/notifyAll() 是Object类的方法

1. wait() 与notify/notifyAll方法必须在同步代码块中使用

在执行以上方法时,要先获得锁。那么怎么获得锁呢?

使用synchronized关键字获得锁。因此,wait() 与  notify/notifyAll() 经常与synchronized搭配使用,

即在synchronized修饰的同步代码块或方法里面调用wait() 与  notify/notifyAll()方法。

2. wait() 与  notify/notifyAll() 的执行过程

前提:锁只有一把,只是一个对象

当线程执行lock.wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

当执行notify/notifyAll方法时,会唤醒一个/所有处于等待该对象锁的线程

  1. package cn.bit13.libra.testWaitNotify;
  2.  
  3. public class ThreadA extends Thread{
  4. private Object lock;
  5. public ThreadA(Object lock){
  6. super();
  7. this.lock= lock;
  8. }
  9.  
  10. @Override
  11. public void run(){
  12. synchronized (lock){
  13. try {
  14. System.out.println("A放弃锁");
  15. lock.wait();
  16. }catch(InterruptedException e){
  17.  
  18. }
  19. System.out.println("A重获锁");
  20. }
  21. }
  22. }
  1. package cn.bit13.libra.testWaitNotify;
  2.  
  3. public class ThreadB extends Thread{
  4. private Object lock;
  5. public ThreadB(Object lock){
  6. super();
  7. this.lock= lock;
  8. }
  9.  
  10. @Override
  11. public void run(){
  12. synchronized (lock){
  13. System.out.println("B通知A可以重获锁(但必须等B执行完)");
  14. lock.notify();
  15. System.out.println("B运行完");
  16. }
  17. }
  18. }
  1. package cn.bit13.libra.testWaitNotify;
  2.  
  3. public class TestWaitNotify {
  4. public static void main(String[] args){
  5. Object lock= new Object(); //锁即一个对象
  6. Thread a= new ThreadA(lock);
  7. a.start();
  8. Thread b= new ThreadB(lock);
  9. b.start();
  10. }
  11. }

输出:

A放弃锁
B通知A可以重获锁(但必须等B执行完)
B运行完
A重获锁

3. notify()通知第一个wait的进程,notifyAll()通知所有wait的进程

wait() 与 notify/notifyAll()的更多相关文章

  1. java 多线程之wait(),notify,notifyAll(),yield()

    wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ...

  2. java中的wait(),notify(),notifyAll(),synchronized方法

    wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法.意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了.这三个方法 ...

  3. java 多线程(wait/notify/notifyall)

    package com.example; public class App { /* wait\notify\notifyAll 都属于object的内置方法 * wait: 持有该对象的线程把该对象 ...

  4. Java多线程8:wait()和notify()/notifyAll()

    轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处 ...

  5. 使用Object的wait,notify,notifyAll做线程调度

    我们知道java中的所有类的祖先都是Object,Object类有四个个方法wait(),wait(long timeout),notify(),notifyAll(),这四个方法可以用来做线程的调度 ...

  6. Java多线程之wait(),notify(),notifyAll()

    在多线程的情况下,因为同一进程的多个线程共享同一片存储空间,在带来方便的同一时候,也带来了訪问冲突这个严重的问题.Java语言提供了专门机制以解决这样的冲突,有效避免了同一个数据对象被多个线程同一时候 ...

  7. Java多线程的wait(),notify(),notifyAll()

    在多线程的情况下.因为多个线程与存储空间共享相同的过程,同时带来的便利.它也带来了访问冲突这个严重的问题. Java语言提供了一种特殊的机制来解决这类冲突,避免同一数据对象由多个线程在同一时间访问. ...

  8. Java多线程学习之wait、notify/notifyAll 详解

    1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2.wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关 ...

  9. 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型

    关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...

  10. Java多线程:wait(),notify(),notifyAll()

    1. wait(),notify(),notifyAll() 2. wait() 2.1. wait() 2.2. wait(long timeout) 2.3. wait(long timeout, ...

随机推荐

  1. (转)Unity笔记之编辑器(BeginFadeGroup、BeginHorizontal、BeginScrollView) ... ...

    1. BeginFadeGroup(float value) 这是EditorGUILayout中的一个函数,用来隐藏/显示在它包含的组中的内容.value则是显示内容的量,范围是0-1 . 比较下未 ...

  2. 如何用MathType编辑这三个符号

    MathType是一款专门的公式编辑器,用来编辑数学物理等公式,很多期刊杂志的排版都会用到它.用MathType编辑公式的时候,完全不用考虑学习和上手的过程,打开就可以编辑出你的公式,所以这个工具对于 ...

  3. EntityFramework增删改查

    http://www.cnblogs.com/libingql/archive/2013/01/29/2881988.html

  4. py-faster-rcnn 训练自己的数据

    转载:http://blog.csdn.net/sinat_30071459/article/details/51332084  Faster-RCNN+ZF用自己的数据集训练模型(Python版本) ...

  5. js如何去除多个cookie?

    转自:https://zhidao.baidu.com/question/211006012.html :1:设置cookie 最简单的就是:document.cookie="user=aa ...

  6. x-webkit-speech语音搜索

    如果你没看到语音图标说明你的浏览器不支持x-webkit-speech 换个chrome你会发现输入框的右侧出现语音小图标.

  7. python框架Scrapy中crawlSpider的使用——爬取内容写进MySQL

    一.先在MySQL中创建test数据库,和相应的site数据表 二.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo4 三.进入 ...

  8. 在DO搭建自己的ss

    前期准备: 1.一个paypal账户 2.国外的一台VPS paypal的注册需要一个邮箱和一张信用卡即可. VPS的话经过搜索对比,决定使用DigitalOcean的.(点击此链接注册DO可获得10 ...

  9. 第14章—数据库连接池(C3P0)

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  10. Web 资源介绍

    软件体系结构 C/S, client/server 特点: 该结构的软件, 客户端和服务端都需要编写 开发成本较高,维护较为麻烦 好处: 客户端在本地可以分担一部分运算 B/S, browser/se ...