park 和 unpark
park和unpark是LockSupport里面的方法,park的中文翻译有停在这的意思,所以park方法的作用就是停下一个线程,而unpark就是唤醒线程。
特点
与Object的wait¬ify相比
- wait和notify相比必须配合Object Monitor一起使用,而park,unpark则不用
- park&unpark是以线程为单位来阻塞和唤醒线程的,而notify只能随机唤醒一个,notifyAll只能唤醒所有,不怎么精确
- park&unpark是可以先unpark的类似于先打个预防针,而wait¬ify则不能
原理
每个线程都有自己的一个Parker对象(是由底层c++代码实现的),由三部分组成_counter , _coud , _mutex 。
其中我们重点关心的是_counter,其中只有两种值0,1。
看个例子:
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
log.debug("开始");
LockSupport.park();
log.debug