wait、notify和notifyAll方法学习
wait、notify和notifyAll方法
wait() 方法会使该锁资源释放,然后线程进入等待WAITING状态,进入锁的waitset中,然后等待其他线程对锁资源调用notify方法或notifyAll方法进行唤醒,否则就会进入无限等待。唤醒后会继续执行wait() 后面的代码。
wait(long timeout) 和 wait(long timeout, int nanos) 两个方法差不多,就是对wait方法的过期时间进行限制,如果超过该时间,就将线程放出来进入等待队列继续请求锁资源,然后得到锁资源后继续从wait()方法后面执行。等待过程中线程的状态为TIMED_WAITING,和wait()方法进行区分。
wait和sleep方法进行对比
wait方法首先会释放锁,然后进入一个WAITING(没有timeout参数)或者TIMED_WAITING(有timeout参数)状态,然后等待唤醒或者过期自动唤醒,重新去竞争锁资源。
sleep方法就不会释放锁资源,直接将线程设置进入TIMED_WAITING状态,等待时间过去继续执行后续代码
设计模式-保护性暂停
A ---- > B <------- C
首先会两个线程需要对一个GuardObject 进行存取,首先A会等待C把东西放进去然后A将其取出。
class GuardObjectOld{
private Object value;
public synchronized Object getObject(){
while (value == null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return value;
}
public synchronized void setObject(Object o){
this.value = o;
this.notifyAll();
}
}
首先呢两个线程会对同一个GuardObject 对象进行存取。
取线程会调用getObject()方法,然后当value为空会进入wait方法等待存线程放入资源。
存线程调用setObject方法放入资源,然后进行通知waitset中的线程醒过来取资源。
然后可以对其进行增加超时保护
/**
* 增加超时检验
*/
@Slf4j
class GuardObject{
private Object value;
public synchronized Object getObject(long timeout){
long startTime = System.currentTimeMillis();
long waitTime = 0;
while (value == null){
if (timeout - waitTime <= 0){
break;
}
try {
// 防止虚假唤醒,然后又要等好几秒
this.wait(timeout - waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
waitTime = System.currentTimeMillis() - startTime;
}
return value;
}
public synchronized void setObject(Object o){
this.value = o;
this.notifyAll();
}
}
在上述代码基础上加入了超时保护,首先是记录运行时间waitTime,刚开始为0。
如果过程中没有被其他的线程唤醒,线程会执行wait(2000)方法等待2秒如果没有被唤醒就直接继续执行下面代码,继续循环if语句判断true跳出循环。
如果过程中被其他的线程虚假唤醒了,然后线程就会发现资源还是空,然后会继续循环,等待时间就是设定的timeout时间减去已经等待的时间waittime。
wait、notify和notifyAll方法学习的更多相关文章
- 多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)
在锁与监视器中有对wait和notify以及notifyAll进行了简单介绍 所有对象都有一个与之关联的锁与监视器 wait和notify以及notifyAll之所以是Object的方法就是因为任何一 ...
- 关于java的wait、notify、notifyAll方法
wait.notify.notifyAll 遇到的问题 之前开发打印机项目,因为需要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait.notify.notifyAll 方法导致出现了 ...
- Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
Java对象中的wait,notify以及notifyAll方法 在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定.这三个方法就是wait(),notif ...
- 【并发编程】Object的wait、notify和notifyAll方法
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 方法简介 wait方法 wait方法是Object类中的 ...
- 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用
一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...
- java线程学习之notify方法和notifyAll方法
notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...
- 最简实例说明wait、notify、notifyAll的使用方法
wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...
- 并发编程之二:wait、notify、notifyAll的使用方法
wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. public final native void wait(long timeout ...
- object的wait()、notify()、notifyAll()、方法和Condition的await()、signal()方法
wait().notify()和notifyAll()是 Object类 中的方法 从这三个方法的文字描述可以知道以下几点信息: 1)wait().notify()和notifyAll()方法是本地方 ...
随机推荐
- Blog Ideas
Blog Ideas How-to Post Case Studies Product + Service Updates Product Reviews Content Survey Current ...
- 实现自定义的小程序底部tabbar
背景 诶,当然是为了实现更有温度的代码啦(背后设计师拿着刀对着我) 自带tabbar app.json中配置: tabBar: { backgroundColor: '#fff', borderSty ...
- Spark周总结(一)
本周学习内容: 1.搭建虚拟机Spark环境 2.idea编写Scala脚本并在yarn上运行 总结: 这周是回家第一周,虽然没啥事,但是还是想放松放松,也是万事开头难,跟着教程做,但总有几步跟教程上 ...
- 利用HTML5和css3 选中图片上传到服务器,插件地址如下
https://yusi123.com/3349.html 分三步,需要将js文件和css文件拷贝到项目目录下,在需要选择的图片的文件中引入,然后将HTML代码复制 <!--选择图片模块star ...
- 【编译原理】自底向上分析方法——LR文法分析方法的总结
LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...
- 为Anaconda python3安装gi模块
项目开发中需要使用到gi模块,Ubuntu自带的Python3.5可以正常使用gi.项目解释环境是Anaconda python3.5,提示ImportError: No module named ' ...
- swagger不再是第一选择了
一.前言 工欲善其事,必先利其器 最近对 API 接口协作的软件研究了好久,市面上的软件都下载用了一轮,下面给大家介绍其中的最强「神器」 Apifox. Apifox 官网:apifox.cn 在 ...
- vue3组合式API
vue3组合式API 为什么要用组合式API,我们来看看它是如何解决vue2的局限性的 1.vue2的局限性 当组件内容越来越多,逻辑越来越复杂,可读性就会降低,并且难以维护. vue2组件采用配置式 ...
- VS Code失焦时自动保存编辑器内容
vs code有一个非常好用的功能:就是自动保存. 而且不需要安装什么插件,只需要在编辑器设置就可以了.接下来我们一起来设置吧: 1.打开我们的vs code编辑器.在左下角有个 齿轮图标(管理), ...
- 移动安卓App+BurpSuite的渗透测试
从Android 7.0及以上版本开始,安卓系统更改了信任用户安装证书的默认行为,用户安装的证书都是用户证书,因此不管是filddle还是burp,都是把他们的根证书安装到了用户证书,而有部分移动ap ...