LockSupport使用

LockSupport功能

  1. LockSupport在JDK中主要提供了线程的阻塞和唤醒功能。提供了更高级别的同步功能。
  2. 阻塞方法主要是以park开头的各种方法,唤醒线程的方法只有unpark一个方法。
  3. LockSupport中的 park和unpark方法提供的线程阻塞和唤醒功能,避免了Object中已经废弃方法suspend和resume引起的死锁问题。

阻塞方法

  1. park方法的执行与获得的执行许可有关系。如果获得许可,则调用park方法立即返回;如果没有获得许可,则调用park方法一直阻塞。默认情况下,调用park方法是没有获得许可的,即调用该方法要阻塞。
  2. park方法阻塞时,发生如下情况下可以就可解除阻塞
    2.1 其他线程调用该线程的unpark方法
    2.2 其他线程调用该线程的interrput方法,即park方法能够响应中断。
  3. LockSupport类中的park方法
// 阻塞当前线程
 public static void park()
// 在规定的纳秒时间内阻塞状态
 public static void parkNanos(long nanos) 
 // 在规定的毫秒时间内阻塞
 public static void parkUntil(long deadline)
 // 在规定的时间内阻塞与当前线程相关联的对象
 public static void parkUntil(Object blocker, long deadline)
 // 阻塞与当前线程相关联的对象
 public static void park(Object blocker) 

park

  1. 默认情况下,park方法获取不到执行许可,执行该方法会一直阻塞
public class LockSupportService {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //LockSupport.unpark(Thread.currentThread());
        // 默认是被占用的,会一直阻塞下去
        LockSupport.park();;
        System.out.println("aaaa");
    }
}

1.1. 如果上述程序中先调用LockSupport中的unpark方法,则park方法获取到了许可,则不会阻塞。会立即返回。程序打印出aaaa。

unpark

  1. unpark(Thread thread)方法为唤醒当前执行阻塞的线程。其方法参数就是指需要唤醒的线程对象。
  2. 结合park方法,了解一下LockSupport工具的使用。
public class LockSupportService {

    public static void main(String[] args) {
        // 释放许可 
        LockSupport.unpark(Thread.currentThread());
        // 默认是被占用的
        LockSupport.park();;
        System.out.println("aaaa");
        Thread ta = new Thread(new ServiceA());
        Thread tb = new Thread(new ServiceB(ta));    
        ta.start();
        tb.start();
    }

}
// 线程A
class ServiceA implements Runnable{
    public void run() { 
        LockSupport.park();
         System.out.println("I am  service A ");
    }
}
// 线程B
class ServiceB implements Runnable{
    private Thread thread;
    public ServiceB(Thread thread) {
        super();
        this.thread = thread;
    }

    public void run() {
        try {
            Thread.sleep(20*1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         //thread.interrupt();
         // 唤醒当前阻塞的线程
         LockSupport.unpark(thread);;
         System.out.println("I am  service B "); 
    }
}
  1. 上述程序线程A调用park方法,默认情况下是没有获得许可,一直处于阻塞状态。线程B睡眠20秒后,唤醒线程A。最终程序执行结果如下图所示:
    这里写图片描述
  2. 将线程B中的LockSupport中的unpark方法换成Thread.interrupt方法后,执行效果一样,则证明了LockSupport中的park方法能够响应线程的中断。interrupt中断当前线程的执行状态。
    这里写图片描述

总结

  1. LockSupport工具类在JDK中的并发处理中底层使用挺多的,多用心去理解和多看源码有助于更深刻的了解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值