线程通信-wait和notify方法介绍:

java.lang.Object类提供类两类用于操作线程通信的方法.

wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的线程唤醒该线程.

notify:执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待.

notifyAll():执行该方法的线程唤醒在等待池中等待的所有的线程,把线程转到锁池中等待.

注意:上述方法只能被同步监听锁对象来调用,否则报错IllegalMonitorStateException..

------------------------------------------

假设A线程和B线程共同操作一个X对象(同步锁),A,B线程可以通过X对象的wait和notify方法来进行通信,流程如下:

1:当A线程执行X对象的同步方法时,A线程持有X对象的锁,B线程没有执行机会,B线程在X对象的锁池中等待.

2:A线程在同步方法中执行X.wait()方法时,A线程释放X对象的锁,进入A线程进入X对象的等待池中.

3:在X对象的锁池中等待锁的B线程获取X对象的锁,执行X的另一个同步方法.

4:B线程在同步方法中执行X.notify()方法时,JVM把A线程从X对象的等待池中移动到X对象的锁池中,等待获取锁.

5:B线程执行完同步方法,释放锁.A线程获得锁,继续执行同步方法.

线程通信-使用Lock和Condition接口:

wait和notify方法,只能被同步监听锁对象来调用,否则报错IllegalMonitorStateException.

那么现在问题来了,Lock机制根本就没有同步锁了,也就没有自动获取锁和自动释放锁的概念.

因为没有同步锁,所以Lock机制不能调用wait和notify方法.

解决方案:Java5中提供了Lock机制的同时提供了处理Lock机制的通信控制的Condition接口.

--------------------------------------------------------------------

从Java5开始,可以:

1):使用Lock机制取代synchronized代码块和synchronized 方法.

2):使用Condition接口对象的await,signal,signalAll方法取代Object类中的wait,notify,notifyAll方法.

多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用相关推荐

  1. java多线程笔记补充之线程的生命周期

    多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. ...

  2. java多线程笔记补充之 线程控制操作

    线程休眠:让执行的线程暂停一段时间,进入计时等待状态. 方法:staticvoid sleep(long millis) 调用sleep后,当前线程放弃CPU,在指定时间段之内,sleep所在线程不会 ...

  3. Java多线程(5)--线程通信wait和notify

    例题:使用两个线程打印 1-100.线程1, 线程2 交替打印. 解决:涉及wait()和notify()/notifyAll() class Communicate implements Runna ...

  4. Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  5. 多线程下ArrayList类线程不安全的解决方法及原理

    多线程下ArrayList类线程不安全的解决方法及原理 参考文章: (1)多线程下ArrayList类线程不安全的解决方法及原理 (2)https://www.cnblogs.com/fangting ...

  6. 【java线程】锁机制:synchronized、Lock、Condition

    [Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...

  7. 多线程总结五:线程通信(一)

    当线程在程序中运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,Java提供了一些机制来保证线程协调运行. 1.传统的线程通信借助Object类提供的wait().notify( ...

  8. 线程通信wait与notify

    Wait/notify 可以实现线程间的通信 Wait方法,释放锁 Notify方法,不释放锁 Wait与notify方法 必须配置synchronize使用 package com.bjsxt.ba ...

  9. python scrapy框架基如何实现多线程_Python实现在线程里运行scrapy的方法

    本文实例讲述了Python实现在线程里运行scrapy的方法.分享给大家供大家参考.具体如下: 如果你希望在一个写好的程序里调用scrapy,就可以通过下面的代码,让scrapy运行在一个线程里. & ...

最新文章

  1. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...
  2. C++ 复数类运算符重载
  3. C#--数据类型和类型转换
  4. js遍历多层嵌套对象存在的JSO数据
  5. python实现最小二乘法的线性回归_最小二乘法求线性回归的python实现
  6. day28 socketserver
  7. IDEA配置Maven-scala方式具体操作
  8. python特征工程意义_python数据挖掘--特征工程篇(附代码)
  9. 【转载】2008年世界最大50家石油公司综合排名(按六项指标综合测算)
  10. 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
  11. Java面向对象详解
  12. win10电脑打开计算机快捷键,运行快捷键,教您win10打开运行快捷键是什么
  13. java如何对一个表达式开根号_java实现开根号的运算
  14. 走方格跳格子(dp,递归,排列组合三种方法)
  15. 小白算法积累——单链表6#带头结点单链表+递增有序
  16. sql中的日期和字符串的转化
  17. SQL Compliance Manager Crack
  18. 计算机三级上机题库百度云,全国计算机三级数据库等级考试全套(笔试背诵资料+笔试试题+详细答案+最新数据库技术上机试题题库).doc...
  19. qt invalid use of incomplete type class QDebug
  20. import 下划线作用

热门文章

  1. javascript中的this讲解
  2. mysql存储过程中as_mysql - 存储过程mySQL语法错误意外“ AS” - 堆栈内存溢出
  3. mongodb mysql配置_Nosql_MongoDB数据库配置以及基本指令
  4. 微软黑屏补丁_慎装微软最新Win7补丁 部分用户更新补丁后无法关机
  5. python deepcopy报错_python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)...
  6. android 环形时间显示_使用Arduino构建OLED显示屏与Android手机接口的智能手表
  7. 【学习笔记】第二章——进程同步、进程互斥、进程互斥的硬件/软件实现方法
  8. 【LeetCode笔记】剑指 Offer 57- II. 和为 s 的连续正数序列(Java、滑动窗口、二刷)
  9. html4基础,HTML 基础 4
  10. matlab 等高线_MATLAB作图实例:39:更改等高线图的填充颜色