首页 > 编程语言 >Java-并发-ReentrantLock

Java-并发-ReentrantLock

时间:2024-05-16 22:20:56浏览次数:27  
标签:Java synchronized 获取 ReentrantLock 并发 线程 公平 显式

0.是什么

ReentrantLockjava.util.concurrent.locks 包中的一个类,提供了比 synchronized 关键字更灵活和强大的锁机制。

ReentrantLock 实现了 Lock 接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。

1.为什么

在Java诞生之初,就有了synchronizedReentrantLock 是在 JDK 1.5 中引入的,为啥要引入这个呢?

引入 ReentrantLock 的主要原因是为了解决 synchronized 关键字的一些局限性,并提供更灵活和强大的锁机制,以应对复杂的并发编程需求。

1.1 synchronized的缺点

序号 局限性 描述
1 锁的细粒度控制 synchronized 是隐式锁定的,无法显式地控制锁的获取和释放,锁的范围是整个方法或代码块。
2 不可中断的锁获取 线程在等待获取 synchronized 锁时,不能被中断,可能导致长时间等待,无法响应中断请求。
3 无法实现公平锁 synchronized 锁是非公平的,不能保证锁的获取顺序,可能导致某些线程长时间得不到锁,造成“饥饿”现象。
4 缺乏条件变量支持 synchronized 只提供了 wait()notify()notifyAll() 方法进行线程间的协调,但这些方法的使用和控制相对简单,无法实现复杂的等待条件。

1.2 ReentrantLock的优点

序号 优势 描述
1 显式锁定和解锁 需要显式调用 lock() 获取锁,并显式调用 unlock() 释放锁,提供了对锁的细粒度控制。
2 可中断锁获取 支持 lockInterruptibly() 方法,在等待锁的过程中可以响应中断。
3 超时锁获取 支持 tryLock(long timeout, TimeUnit unit) 方法,允许在指定时间内尝试获取锁,如果超时则放弃获取。
4 公平锁和非公平锁 可以选择公平锁(按请求顺序获取锁)和非公平锁(可能会插队获取锁)。
5 条件变量支持 提供 newCondition() 方法,可以创建多个 Condition 对象,实现复杂的线程间协调。
6 查询锁状态 提供方法查询锁的状态,如 isLocked() 判断锁是否被任何线程持有,isHeldByCurrentThread() 判断锁是否被当前线程持有。

标签:Java,synchronized,获取,ReentrantLock,并发,线程,公平,显式
From: https://www.cnblogs.com/yang37/p/18196856

相关文章

  • Java-线程-wait()、notify()和notifyAll()
    0.是什么(What)wait(),notify(),和notifyAll()方法都是Object类的一部分,用于实现线程间的协作。1.为什么(Why)线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们希望的是它们能够顺序的执行。所以引入了这几个方法,使得我们能保证一定的顺序。1.1Objec类......
  • java复习
    Java复习好久没写博客了,主要是,忙着去干其他事去了。最近Java要考试了,打算梳理一下Java的知识点,主要是一些基础的语法,和Java的核心的常用的类库。ObjectObject类是Java中所有类的父类,因此有必要对该类中的方法进行了解,并记忆。Object类在java.lang中,常用方法如下:equals()......
  • java生成数字运算验证码
    第一步,引入依赖<!--验证码依赖--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> <!--算数验证码使用--><dependency><groupId>......
  • url并发请求
    functionbatchRequest(urls,maxNum){returnnewPromise(resolve=>{if(urls.length===0){resolve([]);return;}constresults=[];letindex=0;letfinishCount=0;asyncfunction......
  • Java面试题:Spring中的循环依赖,给程序员带来的心理阴影
    循环依赖通常发生在两个或多个SpringBean之间,它们通过构造器、字段(使用@Autowired)或setter方法相互依赖,从而形成一个闭环。下面是一个使用字段注入(即使用@Autowired)导致的循环依赖的示例: 示例代码: 假设我们有两个类,ClassA和ClassB,它们相互依赖:publicclassClassA{......
  • JavaScript中执行上下文和执行栈是什么?
    一、执行上下文简单的来说,执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中执行上下文的类型分为三种:全局执行上下文:只有一个,浏览器中的全局对象就是 window对象,this 指向这个全局对象函数执行上下......
  • Java IO
    JavaIO的理解在Java编程中,IO(Input/Output)是处理输入和输出操作的基础。JavaIO库提供了一套完整的API,用于从各种源(如文件、网络、内存等)读取数据,并将数据写入到各种目标中。理解JavaIO库的设计思路、特性和实际用途对于开发健壮且高效的Java应用程序至关重要。JavaIO的设计思......
  • java中的反射
    java中的反射能够分析信息的能力叫反射目录java中的反射1.获取类的方法2.类对象常用功能一、构造方法获取指定的公共构造器获取指定的所有构造器(公共+非公共)获取所有的公共构造方法获取所有的构造方法(公共+非公共)二、成员变量获取指定公共成员变量获取指定所有成员变量(公共+非......
  • java中的拷贝
    目录1.浅拷贝(只拷贝原对象的地址)2.深拷贝(拷贝原对象的所有值)深拷贝的方式这里说的拷贝主要是针对引用类型,而对于基本数据类型,拷贝就是直接把值给另一个对象1.浅拷贝(只拷贝原对象的地址)原对象的值发生变化,拷贝对象的值也会随之发生变化,因为原对象和拷贝对象是同一块空间/......
  • LLM-通义千问:掌握的Java知识过于零散,怎么系统地串一串
    要系统地整理和深化你的Java知识,可以遵循以下几个步骤和策略:1.回顾基础语言基础:从Java的基本语法开始,包括变量声明、数据类型、运算符、控制结构(if-else,for,while等)、数组和方法定义。面向对象编程:深入理解类与对象、继承、封装、多态这些核心概念,并实践如何设计良好的类......