wait-ify工作原理(学习笔记)

Posted 唐 昊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wait-ify工作原理(学习笔记)相关的知识,希望对你有一定的参考价值。

原理之 wait/notify

owner线程发现条件不满足,调用wait方法,即可进入waitset变为 waiting状态
blocked 和 waiting 的线程都处于阻塞状态,不占用CPU时间片
blocked线程会在owner线程释放锁时唤醒
waiting线程会在owner线程调用notify或notifyall时被唤醒,但唤醒后并不意味着立即获得锁,仍然需要进入EntryList重新竞争者

相关API的介绍

obj.wait() 让进入object监视器的线程到waitSet等待
obj,notify() 在object上正在waitSet等待的线程中挑一个唤醒
obj.notifyAll() 让object上正在waitSet等待的线程全部唤醒

他们都是线程之间协作的手段,都属于object对象的方法,必须获得对象的锁,才能调用这几个方法

wait 和 sleep的区别

sleep 是 thread的方法 而wait是object的方法
sleep不需要强制和synchronized配合使用,但wait需要和synchronized一起使用
sleep在睡眠的同时,不会释放对象锁的,但wait在等待的时候会释放对象锁
它们的状态都是一样的,timed waiting

wait-notify 运用机制

实例 送烟的问题


使用wait和notify 配合使用 while 防止虚假唤醒
实例(添加链接描述

3)优雅地使用 wait/notify

什么时候适合使用wait

当线程不满足某些条件,需要暂停运行时,可以使用 wait 。这样会将对象的锁释放,让其他线程能够继续运行。如果此时使用 sleep,会导致所有线程都进入阻塞,导致所有线程都没法运行,直到当前线程 sleep 结束后,运行完毕,才能得到执行。
使用wait/notify需要注意什么
当有多个线程在运行时,对象调用了 wait 方法,此时这些线程都会进入 WaitSet 中等待。如果这时使用了 notify 方法,可能会造成虚假唤醒(唤醒的不是满足条件的等待线程),这时就需要使用 notifyAll 方法

synchronized (lock) 
	while(//不满足条件,一直等待,避免虚假唤醒) 
		lock.wait();
	
	//满足条件后再运行


synchronized (lock) 
	//唤醒所有等待线程
	lock.notifyAll();


以上是关于wait-ify工作原理(学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章

浏览器工作原理学习笔记

网络钓鱼工作原理图

OSPF协议的工作原理和基本配置(学习笔记)

知了堂学习笔记ajax工作原理

php laravel框架学习笔记 基本工作原理

Android学习笔记View的工作原理