LockSupport.park()
LockSupport.park()用于暂停该线程的运行,使其让出cpu的使用权,并进行等待状态。 LockSupport.unPark(Thread thread)用于唤醒指定的线程。
park()和unpark()顺序可以颠倒。
与wait() notify()的区别
- wait() notify() 只能配合synchronized使用,park()、unPark()可以单独使用
- wait(),notify()是实例方法,park()、unPark()是静态方法
- park()和unpark()使用顺序可以颠倒。
- notify()方法不能精确的唤醒某个线程,unpark()可以
@Slf4j(topic = "c.testPark")
public class TestPark {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
try {
log.debug("start...");
Thread.sleep(1000);
log.debug("park...");
LockSupport.park();
log.debug("resume.....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t1");
t1.start();
Thread.sleep(200);
log.debug("unPark");
LockSupport.unpark(t1);
}
}
底层实现原理
LockSupport中的park()和unPack()方法对应UnSafe中的park和unPark方法。底层有三个属性 _mutex,_condition 和 _counter.当先调用park时,由于counter初始为0,当前线程就进入了等待状态。当先调用unParck方法时,会见counter设置为1,调用park方法时,只会将counter置为1,而不会让线程进入等待状态。