java并发-LockSupport

LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpark方法则是指车辆启动离开。

LockSupport:

 

  一、为什么对park()、parkNanos(long nanos)和parkUntil(long deadline)进扩展?

在Java 6中,LockSupport对 park()、parkNanos(long nanos)和parkUntil(long deadline)进行扩展增加了park(Object blocker)、parkNanos(Object blocker,long nanos)和parkUntil(Object blocker,long deadline)3个方法,其实就是多加了一个参数 blocker。blocker是用来标识当前线程在等待的对象,该对象主要用于问题排查和系统监控。

实例:

    public static void main(String[] args) throws Exception {

        new Thread("my-thread-1"){
            @Override
            public void run() {
                LockSupport.park();
            }
        }.start();

        new Thread("my-thread-2"){
            @Override
            public void run() {
                LockSupport.park(new HashMap<>());
            }
        }.start();
    }

线程dump,查看线程状态:

通过线程dump能够查看到该线程的阻塞对象,方便问题定位。

二、方法parkNanos和 parkUntil的区别?

1、parkNanos表示等待多长时间,时间单位是纳秒。1秒=1000000000纳秒。

LockSupport.parkNanos(5*1000000000L); //等待5秒。

2、parkUntil表示等待到什么时间,时间单位是毫秒,1秒=1000毫秒。

LockSupport.parkUntil(System.currentTimeMillis()+5*1000L);//等待5秒。

三、park和unpark  与 wait和notify/notifyAll 的比较?

1、wait和notify/notifyAll方法只能在同步代码块里用,而park和uppark 不需要。

2、unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。

A线程调用object的wait方法后挂起,B线程调用notify/notifyAll方法后,A线程才能继续运行;反过来:如果B线程调用notify/notifyAll方法后,A线程才调用object的wait方法,那么A线程一值处于挂起状态。

A线程调用LockSupport.park方法后挂起自己,B线程调用LockSupport.unpark(A)方法后,A线程能继续运行;反过来:如果B线程调用LockSupport.unpark(A)方法后,A线程调用LockSupport.park方法,那么A线程依然能继续运行。

LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于“许可(permit)”作为关联,permit相当于一个信号量(0,1),默认是0。在unpark()时:是会将permit置为1。在park时:如果permit为0,会阻塞;如果permit为1,不会阻塞并将permit置为0。

猜你喜欢

转载自blog.csdn.net/hong10086/article/details/88913481