同步阻塞和异步非阻塞
-
同步阻塞
- 会造成等待时间长、系统吞吐量不高、线程频繁的创建开启与销毁、导致CPU频繁切换,降低系统性能。 异步非阻塞
- 客户端不用等待结果才返回、提高了系统的吞吐量和并发量、线程重复利用。
wait 和 notify
wait
wait
方法会使当前线程阻塞。wait
方法必须拥有该对象的monitor
,也就是wait
方法必须在同步方法中使用。wait
方法执行后,会放弃对该monitor
的所有权且进入与该对象关联的wait set(线程休息室)
中。wait
方法执行后,可使用notify
或notifyAll
唤醒线程,线程会继续执行,重新获得monitor
,即从wait
方法后继续执行。wait
方法必须是monitor
的对象,即synchronized(object){object.wait();}
中 两个object
必须为同一个对象。wait
的方法是可中断方法。
notify
- 唤醒等待在该线程上的
wait
的对象。 - 线程进入阻塞则被唤醒,如果没有则忽略。
wait 和 sleep
- wait 和 sleep 方法都可以使线程进入阻塞状态。
- wait 和 sleep 方法均是可中断方法,被中断后都会收到中断异常。
- wait 和 Object 的方法,而 sleep 是 Thread 特有的方法。
- wait 方法的执行必须在同步方法中进行,而 sleep 则不需要。
- 线程在同步方法中执行 sleep 方法时,并不会释放 monitor 的锁,而 wait 方法则会释放 monitor 的锁。
- sleep 方法短暂休眠之后会主动退出阻塞,而 wait 方法(没有指定 wait 时间)则需要被其他线程中断后才能退出阻塞。