JUC - ReentrantLock源码解析 - 多图警告

news/2024/5/20 7:24:03 标签: java, ReentrantLock, 可重入锁, 源码解析, juc

文章目录

          • 2.1.1.0 构造函数
          • 2.1.1.1 lockInterruptibly - 可中断锁 - 正在等待获取锁的线程可直接调用Thread.interrupt该线程直接放弃获取锁,且直接抛出异常
            • tryAcquire
            • doAcquireInterruptibly
          • 2.1.1.2 lock - 等待锁的线程在另一个线程被interrupt不会立刻终止的原因,只有获取到锁然后才会终止
          • 2.1.1.3 unlock
          • 2.1.1.5 如果你看懂了前面的代码解析,这段代码的输出你应该也能看懂

FairSync公平锁 - 构造函数true - 线程轮流获得锁
NonfairSync非公平锁 - 默认,构造函数false - 跟Synchronized一样是非公平
2.1.1.0 构造函数

在这里插入图片描述

2.1.1.1 lockInterruptibly - 可中断锁 - 正在等待获取锁的线程可直接调用Thread.interrupt该线程直接放弃获取锁,且直接抛出异常


ReentrantLock
在这里插入图片描述


AbstractQueuedSynchronizer
在这里插入图片描述

tryAcquire


NonfairSync
在这里插入图片描述


Sync
在这里插入图片描述

doAcquireInterruptibly

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.1.2 lock - 等待锁的线程在另一个线程被interrupt不会立刻终止的原因,只有获取到锁然后才会终止

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.1.3 unlock

在这里插入图片描述

在这里插入图片描述


Sync
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.1.5 如果你看懂了前面的代码解析,这段代码的输出你应该也能看懂
区别
1. lockInterruptibly:等待获取锁的线程1,在此过程中,如果被其他线程nterrupt,则该线程1立刻直接不等待获取锁,丢弃锁,直接抛出异常
2. lock:等待获取锁的线程1,在此过程中,如果被其他线程interrupt,则延迟到获取锁才interrupt
java">package top.linruchang.springdemo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 作用:
 *
 * @author LinRuChang
 * @version 1.0
 * @date 2021/03/14
 * @since 1.8
 **/
@Slf4j
public class OtherTest3 {
    public static void main(String[] args) throws InterruptedException {

        System.out.println("\n=========LockInterruptibly===========\n");
        testLockInterruptibly();


        Thread.sleep(15000);

        System.out.println("\n==========Lock==========\n");
        testLock();

    }


    public static void testLockInterruptibly() throws InterruptedException {
        TestLock testLock = new TestLock();

        Thread thread1 = new Thread(() -> {
            testLock.testLockInterruptibly();
        });
        thread1.start();



        Thread.sleep(500);

        Thread thread2 = new Thread(() -> {
            testLock.testLockInterruptibly();
        });
        thread2.start();


        Thread.sleep(500);
        log.info("中断第二个线程");
        thread2.interrupt();

    }


    public static void testLock() throws InterruptedException {
        TestLock testLock = new TestLock();

        Thread thread1 = new Thread(() -> {
            testLock.testLock();
        });
        thread1.start();



        Thread.sleep(500);

        Thread thread2 = new Thread(() -> {
            testLock.testLock();
        });
        thread2.start();


        Thread.sleep(500);
        log.info("中断第二个线程");
        thread2.interrupt();

    }


}

@Slf4j
class TestLock {

    ReentrantLock reentrantLock = new ReentrantLock();


    public void testLockInterruptibly() {
        String threadName = Thread.currentThread().getName();
        log.info(threadName + "启动");
        try {
            //获取到锁,但可以调用interceprt使得锁失效
            reentrantLock.lockInterruptibly();
            log.info(threadName + ":休眠10s");
            Thread.sleep(10000);
            log.info(threadName + ":休眠起来啦");
        } catch (Exception e) {
            log.error(threadName + ":发生异常" + e);
        } finally {
            reentrantLock.unlock();
            log.info(threadName + "结束,并释放锁");
        }
    }


    public void testLock()  {
        String threadName = Thread.currentThread().getName();
        log.info(threadName + "启动");
        try {
            //获取到锁,但可以调用interceprt使得锁失效
            reentrantLock.lock();
            log.info(threadName + ":第一个休眠10s");
            try {
                Thread.sleep(10000);
            }catch (Exception e) {
                log.error(threadName + ":发生异常【第一个休眠】" + e);
            }
            log.info(threadName + ":第一个休眠起来啦");

            log.info(threadName + ":第二个休眠10s");
            try {
                Thread.sleep(10000);
            }catch (Exception e) {
                log.error(threadName + ":发生异常【第二个休眠】" + e);
            }
            log.info(threadName + ":第二个休眠起来啦");


        } catch (Exception e) {
            log.error(threadName + ":发生异常" + e);
        } finally {
            reentrantLock.unlock();
            log.info(threadName + "结束,并释放锁");
        }
    }
}


在这里插入图片描述


http://www.niftyadmin.cn/n/1657813.html

相关文章

如何让图片在html中自动填充颜色,教你快速给白背景图填充背景颜色

教你快速给白背景图填充背景颜色时间:2019-04-22 21:25:31 作者:温耀忠 浏览(1542)不会给图片换背景色吗?没有关系,耀忠在这里仅需四步教你使用PS给新建的图层或白色图添加背景色。当你用PS新建的图层默认都是白色,但有…

[转载]这18条背下来没人敢和你忽悠CPU

这18条背下来没人敢和你忽悠CPU作者:天极blog 来源:天极网 1.主频 主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的主频=外频倍频系数。很多人认为主频就决定着CPU的运行速度,这不仅是个片面的…

JUC - LinkedBlockingQueue源码解析 - 多图警告

文章目录LinkedBlockingQueue - 基于链表的阻塞队列继承关系源码解析LinkedBlockingQueue - 基于链表的阻塞队列 啥是阻塞:  ① 队列已经容量满,在put的话,该线程一直等待,直到容量不满才可以put进去  ② 队列已经无元素可取&am…

实训报告万能模板计算机专业,计算机专业实训报告模板

实验一 微机组装一、 实训目标通过学习本实训内容,掌握微机组装方面的知识,进一步加深对微机硬件系统的认识,具备微机硬件维护的基本功能。二、 实训内容分组练习微机硬件组装,学习常用工具的使用、常用消除静电的方法&#xff0c…

计算机科学与技术专业规化,计算机科学与技术专业认识与规划

《计算机科学与技术专业认识与规划》由会员分享,可在线阅读,更多相关《计算机科学与技术专业认识与规划(4页珍藏版)》请在装配图网上搜索。1、专业认识与规划对于这个专业的学生,它要求学生的英语水平,数学水平很高。最主要的是&a…

Win32 API下的多线程编程

Win32 API是Windows操作系统内核与应用程序之间的界面,它将内核提供的功能进行函数包装,应用程序通过调用相关函数而获得相应的系统功能。为了向应用程序提供多线程功能,Win32 API函数集中提供了一些处理多线程程序的函数集。直接用Win32 API…

html5网站布局,18个详细的HTML5网站布局编码教程

HTML 5是近十年来Web开发标准一个巨大的飞跃,和以前的版本不同,HTML 5并非仅仅用来表示Web内容,它的新使命是将Web带入一个成熟的应用平台,在HTML 5平台上,视频、音频、图象、动画以及同电脑的交互都被标准化。随着现代…

Tomcat全局自定义配置400、404、500页面

文章目录方式1:仅Tomcat8才支持 - server.xml方式2:Tomcat8不支持全局配置400 - web.xml方式1:仅Tomcat8才支持 - server.xml Tomcat9及以上的ErrorReportValve类代码 - 自行反编译Tomcat8、Tomcat9此类区别 此方法只能在Tomcat9及以上才生…