lockInterruptibly, lock, synchronized 的关于响应中断的区别

场景: 两个线程都需要执行同一个任务(Runnable),先让其中一个执行,拿到锁后睡五秒。紧接着 第二个线程开始执行,等第二个开始执行3秒后,打断(这是第二个线程肯定还未拿到锁)

表现:
lockInterruptibly:thread2立即响应中断抛出异常
lock和synchronized: thread2一直尝试拿到锁后才响应中断

测试用例:
lockInterruptily/ lock

static class Task implements Runnable {
        @Override
        public void run() {
            try {
                lock.lockInterruptibly(); 
                // lock.lock()
                System.out.println(Thread.currentThread().getId() + "come");
                TimeUnit.SECONDS.sleep(5);
                System.out.println(Thread.currentThread().getId() + "over");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }

synchronized

 private static Object object = new Object();
    static class Task implements Runnable {
        @Override
        public void run() {
            synchronized(object) {
                try {
                    System.out.println(Thread.currentThread().getId() + "come");
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println(Thread.currentThread().getId() + "over");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

main:

 Task task = new Task();
        Thread t1 = new Thread(task);
        t1.start();
        TimeUnit.MILLISECONDS.sleep(300);

        Thread t2 = new Thread(task);
        t2.start();

        TimeUnit.SECONDS.sleep(3);
        System.out.println("执行打断");
        t2.interrupt();

如果是打断已拿到锁的线程的话,三者均直接立即响应中断

  Task task = new Task();
        Thread t1 = new Thread(task);
        t1.start();
     
        TimeUnit.SECONDS.sleep(3);
        System.out.println("执行打断");
        t1.interrupt();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值