当前位置: 首页 > news >正文

java并发-ReentrantLock

当多个线程需要同时对共享资源进行操作时,就需要用到线程同步技术。Java中提供了synchronized关键字用于线程同步,而ReentrantLock就是另外一种用于线程同步的技术,本文将介绍ReentrantLock及其使用方法。

### 1. 概述

ReentrantLock是Java中提供的一个可重入锁,可以用于替代synchronized关键字实现线程安全的同步。它和synchronized关键字类似,但是提供了更多的同步控制功能。

ReentrantLock是ReentrantLock类的实例化对象,其核心方法是lock()和unlock(),在线程访问共享资源时,获取锁之后进行操作,操作完成之后释放锁,以便其他线程也能访问共享资源。

### 2. 使用方法

#### 2.1 基本使用

使用ReentrantLock需要先创建一个ReentrantLock实例,然后在共享资源访问前调用lock()方法获取锁,在共享资源访问完毕后调用unlock()方法释放锁。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() {
    lock.lock();
    try {
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}
```

在使用Lock时,需要注意访问共享资源的代码要放在try...finally块中,因为只有在finally块中释放锁才能保证锁的正确释放。

#### 2.2 tryLock方法

ReentrantLock提供了一个tryLock()方法,它可以尝试获取锁,如果获取成功则返回true,否则返回false。使用tryLock()方法可以避免线程因等待获取锁而被阻塞的情况。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() {
    if (lock.tryLock()) {
        try {
            // 访问共享资源
        } finally {
            lock.unlock();
        }
    } else {
        // 如果获取锁失败,则执行其他逻辑
    }
}
```

#### 2.3 LockInterruptibly方法

ReentrantLock还提供了LockInterruptibly()方法,它可以在获取锁时响应中断。如果当前线程被中断,则会立即抛出InterruptedException异常。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() throws InterruptedException {
    lock.lockInterruptibly();
    try {
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}
```

#### 2.4 使用条件对象

ReentrantLock还可以使用条件对象(Condition)来实现更精细的线程同步。条件对象可以通过ReentrantLock的newCondition()方法创建,然后使用await()方法等待条件变量,使用signal()方法通知等待线程条件变量已经发生变化。

```java
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void accessResource() throws InterruptedException {
    lock.lock();
    try {
        while (condition不满足) {
            condition.await();
        }
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}

public void changeCondition() {
    lock.lock();
    try {
        // 改变条件变量的值
        condition.signalAll();
    } finally {
        lock.unlock();
    }
}

`ReentrantLock` 是一个可重入的互斥锁,其底层结构使用了一个同步器 `Sync` 来实现。`ReentrantLock` 提供了两种实现方式:公平锁和非公平锁。

公平锁指的是获取锁的线程按照请求锁的顺序来获取锁,即先来先得。而非公平锁则是多个线程同时抢占锁,不保证获取锁的顺序,可能会导致某些线程一直获取不到锁。

从底层实现来讲,公平锁和非公平锁的区别在于 `Sync` 类的 `tryAcquire` 方法的实现。

对于公平锁,`tryAcquire` 方法中会先检查队列中是否有等待锁的线程,如果有的话,当前线程就不会去争抢锁,而是会进入到等待队列中,等待锁被释放后再次尝试获取锁。如果队列中没有等待锁的线程,则通过 `CAS` 操作去尝试获取锁。

对于非公平锁,`tryAcquire` 方法中则直接通过 `CAS` 获取锁,此时不会去检查等待队列中是否有线程在等待锁。

因此,公平锁对于线程的调度和执行效率都会影响比较大,因为它必须按照请求锁的顺序来分配锁。而非公平锁则可能会导致某些线程长时间等待锁,但它的执行效率相对较高,因为可以并发获取锁。

### 3. 总结

ReentrantLock提供了更灵活、更安全的线程同步机制,可以替代synchronized关键字实现线程安全的同步。它提供了多种同步控制方法,包括获取锁的尝试、响应中断、使用条件变量等。使用ReentrantLock时需要注意锁的粒度,避免出现线程死锁的情况。

相关文章:

java并发-ReentrantLock

当多个线程需要同时对共享资源进行操作时,就需要用到线程同步技术。Java中提供了synchronized关键字用于线程同步,而ReentrantLock就是另外一种用于线程同步的技术,本文将介绍ReentrantLock及其使用方法。 ### 1. 概述 ReentrantLock是Java…...

21.模型的访问器和修改器

学习要点: 1.访问器 2.修改器 本节课我们来开始学习数据库模型的访问器和修改器的使用。 一.访问器 1. 访问器:就是在获取数据列表时,拦截属性并对属性进行修改的过程; 2. 比如,我们在输出性别时&#xff0…...

72 yaffs文件系统挂载慢 sync不起作用

1 引言 最近在开放过程中遇到了一个问题:Linux在启动挂载根文件系统时很慢很慢!而且每次开机都是这样,一下子让人难以理解。 因为,理论上当机器第一次启动,会扫描完整的rootfs的flash区域,从而建立索引&…...

【无标题】春漫乌海湖!

春漫乌海湖! 杨桂林 黄河流经几字弯内蒙古段的第一段便遇见了镶嵌在大漠中的璀璨明珠乌海湖。 谁也不会相信:这里被乌兰布和、库布其、毛乌素三大沙漠重重包围,矿山林立,煤尘喧嚣飞扬的黑色煤都,如今在金色沙海的映衬下,柔润潋滟周…...

Red Hat重置root密码

目录 前言 1、使用rd.break参数重置root密码 2、使用安装盘重置root密码 前言 我们有时会忘记linux系统的root密码,有的不会重置密码只能重置系统了,下面介绍两种重置root密码的方法 1、使用rd.break参数重置root密码 1、启动系统,并在…...

应急响应之日志排查方法,Linux篇

应急响应之日志排查方法,Linux篇 1.Linux系统日志位置2.Linux日志分析方法3.其他日志的分析中间件日志其他服务日志1.Linux系统日志位置 Linux 系统中的日志一般存放在目录“/var/log/”下,具体的日志功能如下 /var/log/wtmp:记录登录进入、退出、数据交换、关机和重启,即…...

Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

🚀 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数&…...

DevOps 的道术法器,探寻 DevOps “立体化”实践之旅

​引言 随着业务的发展,软件发布迭代的频率越来越高,传统的瀑布型模式已经不能满足快速交付的需求,DevOps 也因此受到持续关注。越来越多的公司开始接受并尝试使用 DevOps,期望能使得软件开发中的构建、测试与发布工作变得更加快捷…...

redis 7.x 缓存双写一致性的解决方案

一 redis缓存双写一致性 1.1 保证redis一致性的原则 1.给缓存设置过期时间,定期清理缓存并写回,是保证最终一致性的解决方案。使用场景:在数据读多写少的情况下作为缓存来使用。 我们可以对已存入缓存的数据设置过期时间,所有…...

真题详解(语法分析输入记号流)-软件设计(八十)

真题详解(求叶子结点数)-软件设计(七十九)https://blog.csdn.net/ke1ying/article/details/130787349?spm1001.2014.3001.5501 极限编程XP最佳实践: 测试先行、 按日甚至按小时为客户提供可运行的版本。 组件图的 插座 和插头…...

ffmpeg-编译汇总01

ffmpeg-编译汇总 ubuntu18.04下编译ffmpeg 所有安装目录 /usr/local 1.nasm编译器编译 (nasm-2.13.03解包) ./configure --prefix/usr/local make -j4 sudo make install 注意:能检测到可以不用设置下面的环境。 安装完成后,为了系统能自动找到nasm程序&…...

素雅的登录界面,简单而优雅

先上效果图&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*, *::after, *::before {margin: 0;padding: 0;box-sizing: bord…...

Docker数据目录迁移方法

文章目录 前言一、停掉Docker服务&#xff1f;二、迁移docker数据到数据盘目三、备份原数据目录四、添加软链接五、重启docker服务六、确认服务没有问题后&#xff0c;删除备份的目录总结 前言 服务器上安装的docker服务&#xff0c;数据默认存储在/var/lib/docker目录&#x…...

C++——动态规划

动态规划是一种解决复杂问题的算法思想。它通过将问题分解为更小的子问题&#xff0c;并利用子问题的解来构建原问题的解。动态规划通常用于优化问题&#xff0c;其中需要找到最优解或最大值/最小值。 动态规划的核心思想是存储并重复使用子问题的解&#xff0c;以避免重复计算…...

【FAQ】视频编辑服务常见问题及解答

Q1问题描述 1、 访问贴纸等素材的时候提示“网络异常&#xff0c;请重试”怎么办&#xff1f; 2、 使用AI能力时&#xff0c;提示“errorCode:20124 errorMsg:Method not Allowed”&#xff1f; 解决方案 请做以下检查&#xff1a; 1、 在代码中检查鉴权信息是否已设置。如…...

JavaEE(系列8) -- 多线程案例(单例模式)

目录 1. 设计模式 2. 单例模式 -- 饿汉模式 3. 单例模式 -- 懒汉模式 4. 单例模式(懒汉模式-多线程) 1. 设计模式 什么是设计模式? 设计模式好比象棋中的 "棋谱". 红方当头炮, 黑方马来跳. 针对红方的一些走法, 黑方应招的时候有一些固定的套路. 按照套路…...

深度剖析,如何从底层代码层面理解Selenium和Appium的关联

目录 前言&#xff1a; 一、Selenium和WebDriver 二、Appium和WebDriver 三、Selenium和Appium的底层关联 1. Selenium WebDriver提供底层的浏览器控制机制 2. 利用JSON Wire Protocol通信协议实现通讯机制 四、实例代码 总结&#xff1a; 前言&#xff1a; Selenium和…...

【Three.js】第一、二章 入门指南和基础知识

01.介绍 Three.js 非常庞大&#xff0c;你可以用它做无数的事情。 在第一章中&#xff0c;我们将学习所有基础知识&#xff0c;例如创建第一个场景、渲染、添加对象、选择正确的材料、添加纹理、为所有内容制作动画&#xff0c;甚至将其放到网上。有些人可能会觉得这部分有点…...

力扣第 104 场双周赛 2681. 英雄的力量

原题链接力扣 题目大意&#xff1a;我开始看成连续子段了&#xff0c;写了个递归程序....... 一个数组任选一个子序列&#xff0c;子序列的力量值最大值平方*最小值。求所有子序列的力量和。 分析过程&#xff1a;如序列长度为n&#xff0c;子序列总数为2的n次幂&#xff0c…...

在linux上创建crypto_LUKS格式的块设备

要在Linux上创建一个块设备并将其格式化为 crypto_LUKS&#xff0c;可以按照以下步骤进行&#xff1a; 创建一个空白文件&#xff0c;作为块设备的基础。可以使用 dd 命令创建指定大小的文件&#xff0c;例如&#xff1a; dd if/dev/zero of/path/to/device bs1M count100这将创…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...