java线程方法notify,JAVA-线程wait方法与notify方法详解
一、notify的含义(视为使当前线程获取对象锁并于规定一定条件下释放的方法)
(1)notify一次只随机通知一个线程进行唤醒(notifyAll则为全部)
(2) 在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁,
要等到执行notify方法的线程将程序执行完 ,也就是退出sychronized代码块后,当前线程才会释放锁,
而呈wait状态所在的线程才可以获取该对象锁。
对象锁释放的三种情况
序号场景
1、执行完同步代码块就会释放对象的锁
2、在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
3、在执行同步代码块的过程中,执行了锁所属对象的wait方法,这个线程会提前释放对象锁,而此线程对象会进入线程等待池中,等待被唤醒(阻塞),直到等到到下一个notify将锁给他,才开始执行最后一个wait后面剩余的代码。
二,wait的含义(视为使当前线程马上释放对象锁并阻塞的方法)
(1)将当前进程挂起,等待唤醒
(2)wait( )会先释放锁住的对象,然后再执行挂起的动作。参见以上第3点
三、为什么wait方法与notify方法要用synchronized保证同步
1. 正如Java内任何对象都能成为锁(Lock)一样,任何对象也都能成为条件队列(Condition queue)。而这个对象里的wait(), notify()和notifyAll()则是这个条件队列的固有(intrinsic)的方法。
2.一个对象的固有锁和它的固有条件队列是相关的,为了调用对象X内条件队列的方法,你必须获得对象X的锁。这是因为等待状态条件的机制和保证状态连续性的机制是紧密的结合在一起的。
根据上述两点,在调用wait(),
notify()或notifyAll()的时候,必须先获得锁,且状态变量须由该锁保护,而固有锁对象与固有条件队列对象又是同一个对象。也就是说,要在某个对象上执行wait,notify,先必须锁定该对象,而对应的状态变量也是由该对象锁保护的。
锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。以下实例:定义两个线程轮流分别输出0~99之间的所有数;
等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池
如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。
当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。
优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。
解析:由于输出对象是单纯的对象,所以不需要将其封装成另一个资源类,在同一个run方法中输出即可;
创建线程
以下是线程方法的测试,分几轮进行说明:
http://www.cnblogs.com/techyc/p/3272321.html
http://blog.csdn.net/lingzhm/article/details/44940823
java线程方法notify,JAVA-线程wait方法与notify方法详解相关推荐
- java一个方法排他调用_Java编程实现排他锁代码详解
一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...
- 并发编程-04线程安全性之原子性Atomic包的4种类型详解
文章目录 线程安全性文章索引 脑图 概述 原子更新基本类型 Demo AtomicBoolean 场景举例 原子更新数组 Demo 原子更新引用类型 Demo 原子更新字段类型 使用注意事项: Dem ...
- java中String s=abc及String s=new String(abc)详解
java中String s="abc"及String s=new String("abc")详解 1. 栈(stack)与堆(heap)都是Java用来在R ...
- 【JAVA秘籍心法篇-Spring】Spring XML解析源码详解
[JAVA秘籍心法篇-Spring]Spring XML解析源码详解 所谓天下武功,无坚不摧,唯快不破.但有又太极拳法以快制慢,以柔克刚.武功外式有拳打脚踢,刀剑棍棒,又有内功易筋经九阳神功.所有外功 ...
- java中北大学ppt总结+课后习题第二章(小宇特详解)
java中北大学ppt总结+课后习题第二章(小宇特详解) 基本数据类型 Java语言有8种基本数据类型. 逻辑类型:boolean.1字节 整数类型: 1字节整数类型:byte. 2字节整数类型:sh ...
- java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解
首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...
- 蓝桥杯java B组历年省赛真题汇总及题目详解
蓝桥杯java B组历年省赛真题汇总及题目详解 2019年第十届蓝桥杯省赛真题详解 2018年第九届蓝桥杯省赛真题详解 2017年第八届蓝桥杯省赛真题详解 2016年第七届蓝桥杯省赛真题详解 2015 ...
- 2022年Java面试总结,200多页真题笔记和详解(核心考点、6家大厂)
为了进大厂,花了很多时间和精力在面试准备上,也刷了很多题.但题刷多了有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到,如果只是为面试而刷题是不是在浪费人生呢? 如果你想进大厂,或者去一个更大.更 ...
- Java 贪吃蛇 最简易地实现方法 超简短代码实现 (附源码 详解)
分享一个我刚刚写的贪吃蛇小游戏,非常简短的代码实现方法.这可能是全网最简单实现方法,效果图如下: ps 最新贪吃蛇源码+教学视频+论文下载 java贪吃蛇 有多简短呢 ? 上代码!! 一共四 ...
- Java注解方法实现BigDecimal保留两位小数(案例详解)
[辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...
最新文章
- 解决 mac ox 终端显示bogon 的问题
- bzoj 2109 amp; 2535 空中管制 解读
- 测试用例设计方法_测试用例设计方法——流程分析法(场景法)
- docker客户端连接远程服务器
- python 代码-python经典代码
- dbvis 数据库工具:数据库驱动集合包获取,dbvis数据库工具安装驱动实例演示
- 13张图看懂综合类数据中心机房建设标准!
- [BUUCTF-pwn]——bjdctf_2020_babyrop2
- GPU Gems2 - 13 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)
- 在线打开html文件,html是什么文件?html文件怎么打开?
- 注意满足循环终止条件时counter是否仍在+1(记洛谷P1035WA的经历,Java语言描述)
- sql加载配置文件时出错:_SQL复制:基本设置和配置
- html 空行_一篇文章学习html「经典案例」
- 相关矩阵可视化 – corrplot() 绘图
- vscode-更换图标主题VSCode Icons.
- java modbus通讯协议_Modbus通 讯 协 议
- 10个技巧帮你搞定IE 6
- Ubuntu下配置FLTK的一点经验及使用FLTK编写休息提醒软件
- TOPSIS法作业题
- vue如何在地址栏拼接url参数
热门文章
- 不容错过 名片卡证模板素材网站
- python数字类型分为三类_Python | 数据类型
- UE4全场景卡通渲染
- 7.嵌入式控制器EC实战 ACPI规范中的电源管理通道PMC(Power Management Channel)
- 从O2O和社交电商的协同效应来重新审视传统实体小店
- 数字图像处理之图像显示基础
- echarts地图,需要的省,市,区县的最新的json数据,geoJson数据,下载地址以及可以手动画区域生成json文件,
- Win10任务栏右下角无网络图标的解决办法
- 阿里笔试模拟题-43.打怪兽
- JavaScript原生实现轮播图的滑动切换