当前位置:网站首页>wait()和sleep()的区别理解
wait()和sleep()的区别理解
2022-07-25 15:22:00 【一笑杯莫停】
说实话,除了他们的执行都会让线程阻塞状态以外,我并不认为他们有什么可比性。
1.wait()、notify() 和 notifyAll()方法都是Object的方法,只能在临界区被执行。
2.wait()执行后锁标识会被释放,使用场景是一些不满足条件的线程抢到锁后,为了让条件满足后再来让它执行,就调用这个方法。然后等条件满足后,再调用notify() 和 notifyAll()让它活着它们苏醒。
3.wait()让出锁标识后,其他Runnable状态的的线程就可以正常执行了,而被wait的线程只有被notify() 和 notifyAll()后才有资格进入抢锁大军,也就是说他们被Runnable了。
4.wait()后进入的阻塞状态是跟sleep()后不一样的,叫做“等待阻塞状态”。JVM会把他们放进等待队列里。当然这个等待队列是跟抢锁大军所在的等待队列是不一样的。抢锁大军所在队列里放的都是Runnable状态的线程,抢锁失败后继续摩拳擦掌的那些,他们的阻塞状态叫做“同步阻塞状态”。也就是说出于“等待阻塞状态”的线程,被唤醒后,如果抢不到锁就会变成Runnable状态的铁憨憨和其他Runnable的铁憨憨一起处在“同步阻塞状态”。
5.sleep()是Thread的方法,用的时候要加时间,还有抛异常。挺麻烦的,我有点不喜欢它。它被调用的时候,是不会释放锁标识的,大家都等着它sleep,可自私了。当然线程没有这么人性化,它sleep是为了让跟它通优先级的线程先执行。
下面贴一张百度到的图,解释的很清楚。赞!

最后说点notify() 和 notifyAll()的话,上面总提到他们,不介绍一下有点说不过去的。
1.notify()随机唤醒一个处于“等待阻塞状态”的线程。
2.notifyAll()顾名思义就是全部唤醒处于“等待阻塞状态”的线程。
我们从感觉上来说,只有一个线程可以抢到锁,那么我们就唤醒一个是不是就刚合适?
一定要记住,感觉是不可靠的。尤其是逻辑严谨的编程界,不可靠就意味着风险!
你每次都随机唤醒一个,那就是说,有可能某个线程有几率永远都不可能被唤醒?
所以,notifyAll()是不是会更合适一点?
边栏推荐
- ML - natural language processing - Basics
- Instance tunnel use
- Single or multiple human posture estimation using openpose
- CGO is realy Cool!
- Redis elimination strategy list
- Endnote 添加中文GBT7714样式 word中如何引用文献
- Idea remotely submits spark tasks to the yarn cluster
- Boosting之GBDT源码分析
- SublimeText-win10光标跟随问题
- spark中saveAsTextFile如何最终生成一个文件
猜你喜欢

MySQL installation and configuration super detailed tutorial and simple database and table building method

打开虚拟机时出现VMware Workstation 未能启动 VMware Authorization Service

Spark memory management mechanism new version

Spark partition operators partitionby, coalesce, repartition

延迟加载源码剖析:

如何解决Visual Studio中scanf编译报错的问题

MySql的安装配置超详细教程与简单的建库建表方法

异步fifo的实现

Spark submission parameters -- use of files

推荐10个堪称神器的学习网站
随机推荐
Word 样式模板复制到另一文档
如何解决Visual Studio中scanf编译报错的问题
Spark获取DataFrame中列的方式--col,$,column,apply
从 join on 和 where 执行顺序认识T-sql查询执行顺序
Hbck 修复问题
Endnote 添加中文GBT7714样式 word中如何引用文献
Spark SQL common time functions
在网页上实现任意格式的音视频快速播放功能的开发总结。
反射-笔记
解决DBeaver SQL Client 连接phoenix查询超时
本地缓存--Ehcache
C语言函数复习(传值传址【二分查找】,递归【阶乘,汉诺塔等】)
How spark gets columns in dataframe --column, $, column, apply
The number of query results of maxcompute SQL is limited to 1W
Is it safe to open futures online? Which company has the lowest handling charge?
Spark submission parameters -- use of files
My creation anniversary
单例模式3--单例模式
What is the Internet of things
Single or multiple human posture estimation using openpose