前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程-lock与lockInterruptibly的区别

多线程-lock与lockInterruptibly的区别

作者头像
九转成圣
发布2024-04-10 16:55:15
570
发布2024-04-10 16:55:15
举报
文章被收录于专栏:csdncsdn

多线程-lock与lockInterruptibly的区别

标签:多线程

lock

代码语言:javascript
复制
public static void lock() {
    Lock lock = new ReentrantLock();
    try {
        lock.lock();
        Thread t1 = new Thread(() -> {
            Thread currentThread = Thread.currentThread();
            try {
                lock.lock();
                System.out.println(currentThread.getName() + " lock后的代码");
            } finally {
                lock.unlock();
            }
            System.out.println("currentThread = " + currentThread.getName() + " isInterrupted:" + currentThread.isInterrupted());
        }, "t1");
        t1.start();
        t1.interrupt();
        System.out.println("currentThread = " + Thread.currentThread().getName());
    } finally {
        lock.unlock();
    }
}
代码语言:javascript
复制
currentThread = main
t1 lock后的代码
currentThread = t1 isInterrupted:true

main线程把t1线程的中断标志位设置为true,t1线程拿到锁后继续执行(仅仅是这只了中断标识位)

lockInterruptibly

代码语言:javascript
复制
public static void lockInterruptiblyDemo() {
    Lock lock = new ReentrantLock();
    try {
        lock.lock();
        Thread t1 = new Thread(() -> {
            Thread currentThread = Thread.currentThread();
            try {
                lock.lockInterruptibly();
                System.out.println(currentThread.getName() + " lockInterruptibly后的代码");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            System.out.println("currentThread = " + currentThread.getName() + " isInterrupted:" + currentThread.isInterrupted());
        }, "t1");
        t1.start();
        t1.interrupt();
        System.out.println("currentThread = " + Thread.currentThread().getName());
    } finally {
        lock.unlock();
    }
}
代码语言:javascript
复制
currentThread = main
java.lang.InterruptedException
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220)
	at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
	at Xxx.lambda$lockInterruptiblyDemo$1(Xxx.java:39)
	at java.lang.Thread.run(Thread.java:748)
Exception in thread "t1" java.lang.IllegalMonitorStateException
	at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:151)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261)
	at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:457)
	at Xxx.lambda$lockInterruptiblyDemo$1(Xxx.java:44)
	at java.lang.Thread.run(Thread.java:748)

获取锁之前会判断中断标志位,也就是说可以中断获取锁的线程并抛出异常.

面试题

为什么AQS中的链表要设计成双向链表?

排队等待锁,需要修改前一个节点的状态

唤醒锁的时候:从头结点往后遍历

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多线程-lock与lockInterruptibly的区别
    • 标签:多线程
      • lock
        • lockInterruptibly
          • 面试题
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档