【Java多线程】LockSupport.park()和LockSupport.unPark(Thread thread)

462 阅读1分钟

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);
    }
}

底层实现原理

image.png LockSupport中的park()和unPack()方法对应UnSafe中的park和unPark方法。底层有三个属性 _mutex,_condition 和 _counter.当先调用park时,由于counter初始为0,当前线程就进入了等待状态。当先调用unParck方法时,会见counter设置为1,调用park方法时,只会将counter置为1,而不会让线程进入等待状态。