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

一.

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出去,否则它们执行不了。

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

猜你喜欢

转载自blog.csdn.net/fighting_future/article/details/80397805