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. 学习ELK日志平台(二)

      一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索 ...

  2. springboot-mail发邮件,不需要邮件服务器

    很简单 步骤走起-> 1.需要一个邮箱账号,我以163邮箱为例,先开启第三方服务后获得密码,后面用来邮箱登录 2.加入mail 依赖 3.properties配置账号和第三方服务密码(不是邮箱密 ...

  3. Spark学习摘记 —— Pair RDD转化操作API归纳

    本文参考 参考<Spark快速大数据分析>动物书中的第四章"键值对操作",由于pair RDD的一些特殊操作,没有和前面两篇的API归纳放在一起做示例 前面的几个api ...

  4. input 弹起数字键盘的那些坑

    input ios 踩的大坑 前言:最近有个需求要将全平台的交易密码由原来的 6-16位 复杂密码改为6位纯数字交易密码,涉及到非常多的业务场景,但修改起来也无非两种:设置交易密码,使用交易密码 设置 ...

  5. 大数据学习之路之ambari的安装

    之前按照正常方式安装的hbase不能插入数据 所以今天来尝试下ambari能不能行 已经打了快照 如果不能还能恢复之前的样子

  6. java中时间的规范是按美国,SimpleDateFormat怎么处理

    题目3.2: 如果时间的规范是按美国,怎么处理? import java.text.ParseException;import java.text.SimpleDateFormat;import ja ...

  7. vue中引入jq

    1.cnpm install jquery2.在webpack.base.conf.js中加入一行代码 const webpack=require("webpack") ----- ...

  8. SpringMVC的数据响应方式

    1.页面跳转 *直接返回字符串 *通过ModelAndView对象返回 2.回写数据 *直接返回字符串 *返回对象或集合

  9. 导入,导出excel

    /// <summary> /// 导出数据 /// </summary> /// <param name="XMMC"></param& ...

  10. Rb(redis blaster),一个为 redis 实现 non-replicated 分片的 python 库

    Rb,redis blaster,是一个为 redis 实现非复制分片(non-replicated sharding)的库.它在 python redis 之上实现了一个自定义路由系统,允许您自动定 ...