码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA-初步认识-第十四章-多线程-wait和sleep的区别

时间:2017-12-24 11:14:19      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:bsp   运行   关注   获得   method   post   多线程   .com   上下   

一.

wait和sleep的方法有些类似,我们现在要对其进行描述,区分它们。

wait方法在object类中,而且有两种形式,分别是wait()和wait(long timeout),我们关注后者。

技术分享图片

技术分享图片

参数的截图中表明wait方法可以醒。

等待和睡眠的区别,睡眠是可以醒过来的,但是等待有可能是无休止的。

两者一个是object方法,一个是thread方法。

技术分享图片

sleep能不醒,不需要被人叫。sleep拿着锁,别人进不来。

现在讲述一些有趣的,可能颠覆以往的概念。

技术分享图片

这两个是同一个锁,t0,t1,t2三个线程全部冲入show方法,全部都卧倒了。t0拿到锁this,进入同步代码块,就wait了。一wait就等在这儿了,就进入线程池了,接着就释放执行权了,也释放锁了。因为在另外的method方法中,有可能有notify,要不然t4怎么救t0~t2,

技术分享图片

t0一挂,t1,t2,t4就抢执行权了。t1拿到执行权和锁,进来后也wait了,同样的t2也会挂在这。

技术分享图片

现在要说的是这个问题,t4进来,notifyAll,上面的三个线程全都活了。这就有问题,在同步中,某一个时刻只能有一个线程执行,现在有三个在里面活着,怎么办?

技术分享图片

在外面进不来就安全了,现在都进来了,这下面还有共性代码,多条语句,这三个线程一操作就挂了,

技术分享图片

三个线程都活着,都在等待着执行权,cpu如果切换到t0上,这时候t0也不见得就运行。因为这上下的所有线程都在同步当中,在同步当中,你想要运行,得具备一个资格,你得持有锁。t4一个notifyAll,上面三个线程都活了,只能说明它们都具备了资格,但是t4还拿着锁呢?t4还没出来呢,t4从同步中一出来,锁就放了。这一放,上面三个线程就有一个切到执行权上,它就会获得锁。如果t0获得锁了,它就执行,这时t1和t2是不可能执行的,除非t0出去,否则它们执行不了。

同步里面一个时刻只能有一个线程能够执行,但是活的线程不止一个。谁拿锁谁执行。

 

JAVA-初步认识-第十四章-多线程-wait和sleep的区别

标签:bsp   运行   关注   获得   method   post   多线程   .com   上下   

原文地址:http://www.cnblogs.com/wsw-bk/p/8097358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!