相同点
- 都会使当前线程阻塞,让出cpu执行权
不同点
- sleep是线程中的方法,但是wait是Object中的方法
- sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中
- sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字
- sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)
sleep使用时间概念,到时自动进入Runnable; wait要将当前线程放入到“监视器的等待队列”中,依赖于同步器
注意点
- notify 随机唤醒其中1个线程
- notifyAll 唤醒waitSet队列中的所有线程
- notify/notifyAll 唤醒的线程,会被阻塞,在“当前线程”释放锁对象后,唤醒的线程抢到“锁”后才会继续执行
1, wait与 notify 必须有顺。 notify只对已存在的“等待线程”有效(利用wait/notify通信时,该点要特别注意,否则会出现notify先于wait执行,导致通信失败)。。
2, LockSupport.pack(Thread t) 与unpack 顺序可以互调,不影响结果(实现机制不一样)