Java基础知识: LockSupport的park和unpark

时间:2021-09-06 21:05:51

源码:

public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(false, 0L);
    setBlocker(t, null);
}
public static void unpark(Thread thread) {
    if (thread != null)
        UNSAFE.unpark(thread);
}

从源码可以看出,最终是通过调用unsafe的park和unpark方法。

public native void unpark(Object obj)
public native void park(boolean isAbsolute,long time)

isAbsolute参数是指明时间是绝对的(true),还是相对的(false).

如果是相对的,time的单位是纳秒,使线程阻塞多少纳秒,如(3秒后: 3*1000*1000*1000),如果为0则是无限阻塞...

如果是绝对的,time的单位是毫秒,使线程阻塞到指定时间点, 如(2秒后:System.currentTimeMillis()+2000);

--------

unpark相当于资源数量设置为1, 可以多次调用,但和执行一次没有区别。

park相当于使用资源,把资源数量设置成0。调用时候,如果资源数为1,则不会阻塞线程,如果资源数已经为0则会阻塞线程。

park与unpark的优势:

在多线程的时候,可以在不同的线程调用park或者unpark,不需要像调用wait/notify/notifyAll时,使用一个Object对象存储相应状态,如一个对象调用了wait需要调用notify唤醒,否则就会一直wait,notify只会唤醒一个线程,如果有两个线程调用同一对象的wait,则需要调用notifyAll才行。park和unpark解耦了线程之间的的同步问题。