原理
我之前写过sychronized的原理,讲到了monitor里的owner和entrylist。它还有一个waitset(类似于休息室)。
当owner里的线程长时间占用cpu,但是它不满足解锁的条件,于是可以调用wait()方法,于是进入waitset,状态也调整为waiting。而entrylist里blocked的线程就从此刻被唤醒,竞争owner。
当owner里的线程调用notify()的时候,waitset里waiting的线程被唤醒,进入entrylist重新竞争。
注意:wait()必须在有锁状态被调用
应该修改成
notify()和notifyAll()的区别
一个是在waitset中随机挑一个唤醒,一个是在waitset全部唤醒
sleep和wait的区别
- sleep是thread方法,wait是obj方法
- sleep随地可以调用,wait必须和synchronized一起调用(上面演示过了)
- sleep不会释放锁,wait会释放锁。
实例如下:
用wait方法
看前面的时间,调用wait后锁立刻释放给main线程
反之,看sleep
结果是等待了10s后才释放锁。