一.
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出去,否则它们执行不了。
同步里面一个时刻只能有一个线程能够执行,但是活的线程不止一个。谁拿锁谁执行。