park和unpark的使用,以及底层原理

#使用
1.暂停线程的运行
LockSupport.park()

2.恢复
LockSupport.unpark(暂停的线程对象)

#特点
1.unpark 可以在线程暂停前调用,也可以在线程暂停后调用,暂停后调用能恢复被park暂停的线程运行,暂停前调用unpark(线程对象A),接下来再在线程对象A中调用park,A会继续运行。

#原理
1.每个线程都有一个自己的Parker对象,对象里有三个东西mutex,cond,counter
2.调用park的时候,线程看一下counter是不是0,是0,就阻塞在cond里,并再赋值一下0给counter,
调用unpark,将counter赋值为1,并唤醒cond里的线程,然后再把counter置为0,线程恢复运行。
3.先调用unpark的情况,先置为1,调用park时,发现counter是1,不需要阻塞,继续运行,并把counter置为0.

#扩展
1.wait,notify,notifyAll 必须和锁配合使用,park和unpark不用。
2.park和unpark以线程为单位精准阻塞和唤醒线程,notify是随机唤醒一个线程,而notifyAll唤醒所有的等待线程。

你可能感兴趣的:(park和unpark的使用,以及底层原理)