首页 > 其他分享 >ReentrantLock的介绍及其用法

ReentrantLock的介绍及其用法

时间:2023-08-30 16:44:05浏览次数:30  
标签:Thread lock ReentrantLock System 介绍 用法 线程 println out

Reentrantlock默认是非公平锁

private static ReentrantLock lock = new ReentrantLock();

若想实现公平锁,只需在构造器的fair参数传入true

private static ReentrantLock lock = new ReentrantLock(true);

公平锁会按照线程请求锁的顺序进行获取,遵循先到先得的原则。而非公平锁则没有这种保证,允许新的线程在旧线程之前获取到锁。在大多数情况下,非公平锁的性能更好,因为它允许新的线程立即获取锁,而不需要等待。

lock()方法

        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 1 acquired the lock");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
                System.out.println("Thread 1 released the lock");
            }
        });

lockInterruptibly()方法,线程通过此方法获取锁时,线程在执行任务的过程中可以被打断,释放锁并抛出InterruptedException异常

Thread t1 = new Thread(() -> {
            try {
                lock.lockInterruptibly();
                try {
                    System.out.println("Thread 1 acquired the lock");
                    Thread.sleep(5000);
                } finally {
                    lock.unlock();
                    System.out.println("Thread 1 released the lock");
                }
            } catch (InterruptedException e) {
                System.out.println("Thread 1 was interrupted while waiting for the lock");
            }
        });

        Thread t2 = new Thread(() -> {
            // 让线程2休眠一段时间后打断线程1
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            t1.interrupt(); // 中断线程1的等待
        });
tryLock()方法,尝试获取锁,获取到锁执行逻辑一,没有获取到锁执行逻辑二
        Thread t1 = new Thread(() -> {
            try {
                if (lock.tryLock(5, TimeUnit.SECONDS)) {
                    try {
                        System.out.println("Thread 1 acquired the lock");
                        Thread.sleep(1000);
                    } finally {
                        lock.unlock();
                        System.out.println("Thread 1 released the lock");
                    }
                } else {
                    System.out.println("Thread 1 failed to acquire the lock");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

anyway,这些获取锁的方法,最后都需要调用unlock()方法释放锁,否则其他线程将无法获取锁,从而导致死锁

标签:Thread,lock,ReentrantLock,System,介绍,用法,线程,println,out
From: https://www.cnblogs.com/ashet/p/17667665.html

相关文章

  • 基础介绍篇
    一.在学习之前我们需要了解爬虫的基本流程:1.首先我们要向目标站点发送一个请求,其中包括请求头和请求体等。2.然后页面会反馈给我们一个响应的内容,response包括了HTML、json,图片及视频等。3.解释内容因为返回的response内容是数据我们要转换成我们需要的内容就需要对其进行解析......
  • mysql COALESCE用法 ,GROUP_CONCAT分组用法
    sdroot.dept_namecompany,COALESCE((casewhensd5.dept_name=sdroot.dept_namethennullelsesd5.dept_nameend),(casewhensd4.dept_namein(sdroot.dept_name,sd5.dept_name)thennullelsesd4.dept_nameend),(casewhen......
  • Python教程(11)——Python中的字典dict的用法介绍
    列表虽然好,但是如果需要快速的数据查找,就必须进行需要遍历,也就是最坏情况需要遍历完一遍才能找到需要的那个数据,时间复杂度是O(n),显然这个速度是很难接受的,于是就必须要有新的数据结构出现,于是字典就诞生了!在Python中,字典(Dictionary)是一种无序的数据结构,用于存储键值对(key-value)。......
  • Skywalking UI介绍
    Skywalkingui页面功能菜单栏 仪表盘:查看被监控服务的运行状态;拓扑图:以拓扑图的方式展现服务之间的关系,并以此为入口查看相关信息;追踪:以接口列表的方式展现,追踪接口内部调用过程;性能剖析:对端点进行采样分析,并可查看堆栈信息;告警:触发告警的告警列表,包括服务失败率,请求超......
  • c++数组基本用法
    在C++中,数组是一种最基本的数据结构,用于存储一组相同类型的元素。以下是有关C++数组的一些重要信息:1.**声明和初始化数组:**```cpp//声明一个整数数组,指定大小为5intmyArray[5];//初始化数组的同时赋值intanotherArray[3]={10,20,30};```2.**访问数组元素:**数组中的元......
  • Python的glob库用法
    glob是Python标准库中的一个模块,用于查找匹配特定模式的文件路径名。它通常用于在文件系统中查找文件、文件夹等。下面是glob模块的一些常用用法示例:导入模块:importglob查找所有文件:file_list=glob.glob('/path/to/directory/*')这会返回指定目录中的所有文件......
  • 【性能测试】ulimit命令说明与用法-详解
    目录1、ulimit命令与显示说明2.常用操作-ulimit是临时修改-程序要使用配置得重启3、永久修改的话修改配置文件正文1、ulimit命令与显示说明ulimit命令是Linux系统的内建功能,它具有一套参数集,用于控制shell进程及其所创进程的资源使用限制。它主要用于设置用户和系......
  • RabbitMQ快速入门--介绍和安装
                     ......
  • getline的几种用法
    istream库下istream&getline(char*s,streamsizen);istream&getline(char*s,streamsizen,chardelim);从istream输入流中读取字符传入字符串s,个数为n string库下istream&getline(istream&is,string&str,chardelim);istream&getline(istre......
  • jsonpath用法记录
    {"flag":1,"code":0,"msg":"成功","detail":[{"name":"重疾险","value":"1","children":[......