当前位置:网站首页>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()是不是会更合适一点?
边栏推荐
- Image cropper example
- pageHelper不生效,sql没有自动加上limit
- args参数解析
- 《三子棋》C语言数组应用 --n皇后问题雏形
- Meanshift clustering-01 principle analysis
- Ml speech depth neural network model
- My creation anniversary
- 记一次Yarn Required executor memeory is above the max threshold(8192MB) of this cluster!
- Vscode plugin collection
- Spark memory management mechanism new version
猜你喜欢
随机推荐
Scala110-combineByKey
pkg_ Resources dynamic loading plug-in
异步fifo的实现
The implementation process of inheritance and the difference between Es5 and ES6 implementation
Docker上运行redis以配置文件方式启动,连接客户端报错Error: Server closed the connection
Spark 判断DF为空
Submarine cable detector tss350 (I)
Maxcompute SQL 的查询结果条数受限1W
UIDocumentInteractionController UIDocumentPickerViewController
The number of query results of maxcompute SQL is limited to 1W
Meanshift clustering-01 principle analysis
Object.prototype.hasOwnProperty() 和 in
Image cropper example
ML - 语音 - 传统语音模型
MeanShift聚类-01原理分析
Recommend 10 learning websites that can be called artifact
Object.prototype. Hasownproperty() and in
从 join on 和 where 执行顺序认识T-sql查询执行顺序
SublimeText-win10光标跟随问题
Boosting之GBDT源码分析









