ReentrantLock的lock()和lockInterruptibly()方法的区别
发布日期:2021-06-29 03:44:51 浏览次数:2 分类:技术文章

本文共 3306 字,大约阅读时间需要 11 分钟。

1,ReentrantLock的lock()不会再获锁过程中去响应中断标志。而是再获取锁之后才响应中断。

2,ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。

代码示例:

1.使用lockInterruptibly()的情况:

public class ReentrantLockInterruptibly {    private Lock lock = new ReentrantLock();    public void doBussiness() {        String name = Thread.currentThread().getName();        try {            System.out.println(name + " 开始获取锁");            lock.lockInterruptibly();            System.out.println(name + " 得到锁");            System.out.println(name + " 开工干活");            for (int i=0; i<5; i++) {                Thread.sleep(1000);                System.out.println(name + " : " + i);            }        } catch (InterruptedException e) {            System.out.println(name + " 被中断");            System.out.println(name + " 做些别的事情");        } finally {            try {                lock.unlock();                System.out.println(name + " 释放锁");            } catch (Exception e) {                System.out.println(name + " : 没有得到锁的线程运行结束");            }        }    }    public static void main(String[] args) throws InterruptedException {        ReentrantLockInterruptibly lockTest = new ReentrantLockInterruptibly();        Thread t0 = new Thread(lockTest::doBussiness);        Thread t1 = new Thread(lockTest::doBussiness);        // 启动线程t1        t0.start();        Thread.sleep(10);        // 启动线程t2        t1.start();        t1.interrupt();    }}

返回结果:

Thread-0 开始获取锁Thread-0 得到锁Thread-0 开工干活Thread-1 开始获取锁Thread-1 被中断Thread-1 做些别的事情Thread-1 : 没有得到锁的线程运行结束Thread-0 : 0Thread-0 : 1Thread-0 : 2Thread-0 : 3Thread-0 : 4Thread-0 释放锁

即当thread-0持有了锁在进行任务执行的过程中,主线程使用t1.interrupt();中断了t1线程,使用lock.lockInterruptibly();会立马抛出一个InterruptedException 并进行之后的操作

2.使用lock.lock()情况

public class ReentrantLockInterruptibly {    private Lock lock = new ReentrantLock();    public void doBussiness() {        String name = Thread.currentThread().getName();        try {            System.out.println(name + " 开始获取锁");            lock.lock();            System.out.println(name + " 得到锁");            System.out.println(name + " 开工干活");            for (int i=0; i<5; i++) {                Thread.sleep(1000);                System.out.println(name + " : " + i);            }        } catch (InterruptedException e) {            System.out.println(name + " 被中断");            System.out.println(name + " 做些别的事情");        } finally {            try {                lock.unlock();                System.out.println(name + " 释放锁");            } catch (Exception e) {                System.out.println(name + " : 没有得到锁的线程运行结束");            }        }    }    public static void main(String[] args) throws InterruptedException {        ReentrantLockInterruptibly lockTest = new ReentrantLockInterruptibly();        Thread t0 = new Thread(lockTest::doBussiness);        Thread t1 = new Thread(lockTest::doBussiness);        // 启动线程t1        t0.start();        Thread.sleep(10);        // 启动线程t2        t1.start();        t1.interrupt();    }}

返回结果:

Thread-0 开始获取锁Thread-0 得到锁Thread-0 开工干活Thread-1 开始获取锁Thread-0 : 0Thread-0 : 1Thread-0 : 2Thread-0 : 3Thread-0 : 4Thread-0 释放锁Thread-1 得到锁Thread-1 开工干活Thread-1 被中断Thread-1 做些别的事情

即:在t0线程持有锁并任务执行的过程中,主线程中断了t1线程,但是我们发现,此时t1线程不会立即响应中断标志,而是在t0释放锁之后,去拿到锁了之后,才去响应这个中断标志。

转载地址:https://blog.csdn.net/zcswl7961/article/details/113582631 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ThreadLocal的内存泄漏问题
下一篇:Java的值传递特性

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月28日 14时21分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章