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方法学习的更多相关文章

  1. 多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)

    在锁与监视器中有对wait和notify以及notifyAll进行了简单介绍 所有对象都有一个与之关联的锁与监视器 wait和notify以及notifyAll之所以是Object的方法就是因为任何一 ...

  2. 关于java的wait、notify、notifyAll方法

    wait.notify.notifyAll 遇到的问题 之前开发打印机项目,因为需要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait.notify.notifyAll 方法导致出现了 ...

  3. Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法

    Java对象中的wait,notify以及notifyAll方法 在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定.这三个方法就是wait(),notif ...

  4. 【并发编程】Object的wait、notify和notifyAll方法

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 方法简介 wait方法 wait方法是Object类中的 ...

  5. 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用

    一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...

  6. java线程学习之notify方法和notifyAll方法

    notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...

  7. 最简实例说明wait、notify、notifyAll的使用方法

    wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...

  8. 并发编程之二:wait、notify、notifyAll的使用方法

    wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. public final native void wait(long timeout ...

  9. object的wait()、notify()、notifyAll()、方法和Condition的await()、signal()方法

    wait().notify()和notifyAll()是 Object类 中的方法 从这三个方法的文字描述可以知道以下几点信息: 1)wait().notify()和notifyAll()方法是本地方 ...

随机推荐

  1. 在java web工程中jsp页面中使用kindeditor

    在这之前我们用Notepad++写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了

  2. 爬虫-数据解析-xpath

    xpath 解析 模块安装 : pip install lxml xpath的解析原理 实例化一个etree类型的对象,且将页面源码数据加载到该对象中 需要调用该对象的xpath方法结合着不同形式的x ...

  3. 学习 Haproxy (二)

    1. Haproxy介绍 Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备.虚拟主机.基于TCP和HTTP应用代理等功能.其配置简单,而且拥有很好的对服务器节点的 ...

  4. MyBatis Plus 2.3 个人笔记-03-Active Record

    AR 语法糖  是一种领域模型模式,特点就是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一条记录 实现AR [在代码生成器中可以添加配置] import com.baomidou ...

  5. vue3在组件上使用v-model

    v-model用于在元素上创建双向数据绑定,负责监听用户输入事件来更新数据. v-model应用于输入框 <input v-model="searchText" /> ...

  6. list集合的快速筛选条件方法

    List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若" ...

  7. (stm32学习总结)—GPIO位带操作

    本章参考资料:<STM32F10X-中文参考手册>存储器和总线构架章节.GPIO 章节,<CM3 权威指南 CnR2>存储器系统章节. 位带简介 位操作就是可以单独的对一个比特 ...

  8. 微信小程序自定义tab,多层tab嵌套实现

    小程序最近是越来越火了-- 做小程序有一段时间了,总结一下项目中遇到的问题及解决办法吧. 项目中有个多 tab 嵌套的需求,进入程序主界面下面有两个 tab,进入A模块后,A模块最底下又有多个tab, ...

  9. HTML5中dialog元素尝鲜

    对话框(别称模态框,浮层)是web项目中用于用户交互的重要部分,我们最常见的就是js中 alert(),confirm(),但是这个对话框的不美观,也不能自定义样式,所以在开发的过程中,一般根据自己自 ...

  10. 如何使用vue-cli搭建好的项目

    本人是一枚前端小白,也是从零开始学习vue.js.由于闲着蛋疼,写一点自己的经验,可能有点low.是新手想上道的话,可以看看,如果有大神,也可以给我指导一下,小生感激不尽. 关于如何使用vue-cli ...