1).wait()作为锁对象的方法只有当前线程持有锁才能调用,
2).调用后的线程进入WAITING状态,并进入锁对象的wait set,
3).唤醒WAITING状态线程的方法:notify(),notifyall(),interrupt(),
4).唤醒wait set上线程队列的条件是owner释放锁,
5).在wait set上的线程在竞争锁时如果失败会从WAITING进入BLOCKED
6).调用notify()线程进入什么状态---还是runnable。
notify()或者notifyAll()调用时并不会真正释放对象锁, 必须等到synchronized方法或者同步语法块执行完才真正释放锁,于是有一个思考:notify()这个方法有什么用???
可能是这样:同步代码块里没写notify的线程在退出同步块的时候只会唤醒entry set中的一个线程也就是说:如果不notify,那么在wait set中的线程就会无限等待(那这么做的意义在哪呢??调用了wait就说明线程需要等待别的资源(比如叫资源B),只有提供别的资源(B)的线程准备好资源(B)才有才有唤醒的价值),那么有没有必要让notify()的调用变成锁的持有者才能调用的方法呢?
我在厕所打算拉屎,发现没有烟我无法拉屎,于是我叫了个外卖等烟过来,并且为了不占着厕所不拉屎我到厕所外边的休息室(怪怪的)休息,等烟送过来的时候外卖员会大叫一声“等烟拉屎的!你的烟来了”,于是我听到了召唤,拿到了烟之后我就到排队室重新排队等待厕所没人再去拉屎。(所以问题就在于,外卖员有没有必要亲自排队到独占厕所的时候再喊我出来,正常想法就是外卖员只需要唤醒在厕所等着的人,但是有这种可能外卖员把烟放在了外卖箱里在唤醒我的时候有别的线程拿走了烟,所以外卖员要对烟加锁,但是对烟加锁之后唤醒我我是无法得到烟的(我只能在听到召唤后并且等待外卖员释放了烟的锁之后才能去拿,但是外卖员释放了锁之后很可能在我去拿之前就有别的线程动过了)但是这不是对厕所上锁的理由)