博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wait()、notify()和notifyAll()、sleep()、Condition、await()、signal()
阅读量:4068 次
发布时间:2019-05-25

本文共 1104 字,大约阅读时间需要 3 分钟。

wait()、notify()和notifyAll()是 Object类 中的方法

从这三个方法的文字描述可以知道以下几点信息:
1) wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。
2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)
3) 调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;
4) 调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;
5 ) 如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。
6 ) 调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁);
7 ) 调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。

Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。

因此通常来说比较推荐使用Condition。

1 ) Condition是个接口,基本的方法就是await()和signal()方法;

2 ) Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
3 ) 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用

Conditon中的await()对应Object的wait();

Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()

转载地址:http://bqaji.baihongyu.com/

你可能感兴趣的文章
maven下搭建注解形式的Spring aop
查看>>
SSH性能优化 转
查看>>
spring 事务
查看>>
Linux web工程部署远程必备软件安装
查看>>
Windows 7下硬盘安装CentOS6.4的解决方法
查看>>
JSP不支持EL表达式的解决方案
查看>>
Struts2类型转换器
查看>>
struts2 使用注解、反射、拦截器实现基于方法的权限控制
查看>>
maven 架设 struts2 注解方式 权限控制
查看>>
struts2之多个文件上传
查看>>
struts2之单个文件上传
查看>>
struts2自定义拦截器 模拟session超时的处理
查看>>
面试技巧
查看>>
struts2之防止表单重复提交
查看>>
人不成熟的几大特征
查看>>
《礼仪73》、《处事22计》、《心态24条》、《伤心50句》、《学会长大20》
查看>>
人人都会变老
查看>>
oracle connect by用法
查看>>
Oracle 树操作(select…start with…connect by…prior)
查看>>
maven struts2中,使用ModelDriven
查看>>