首页 > 其他分享 >同步代码块 锁的处理

同步代码块 锁的处理

时间:2024-09-05 10:37:35浏览次数:9  
标签:try 同步 处理 lock 代码 ReentrantLock 共享资源 获取 finally

private final Object workbookLock = new Object();  
  
private int printImageXSSF(int length, XSSFWorkbook wb, XSSFSheet sheet, String imgPath) {  
    synchronized (workbookLock) {  
        // 你的代码逻辑  
    }  
    return length;  
}
private void insertImage(XSSFWorkbook wb, XSSFSheet sheet, ...) {  
    synchronized (workbookLock) {  
        try {  
            // 插入图片的代码  
        } finally {  
            // 这里不需要显式释放锁,因为 synchronized 块会自动处理  
        }  
    }  
}
ReentrantLock 是 Java 并发包 java.util.concurrent.locks 中的一个类,它实现了 Lock 接口,提供了一种比 synchronized 方法和语句更灵活的锁定机制。ReentrantLock 提供了多种功能,包括尝试非阻塞地获取锁、可中断地获取锁、尝试获取锁时设置超时时间等。

以下是如何使用 ReentrantLock 来处理对共享资源的同步访问的基本步骤:

1. 创建 ReentrantLock 实例
首先,你需要在你的类中创建一个 ReentrantLock 的实例。这个实例将用于控制对共享资源的访问。

java
private final ReentrantLock lock = new ReentrantLock();
2. 使用 lock() 方法获取锁
在访问共享资源之前,你需要调用 lock() 方法来获取锁。如果锁当前被其他线程持有,则当前线程将被阻塞,直到锁被释放。

java
lock.lock();  
try {  
    // 访问或修改共享资源的代码  
} finally {  
    // 释放锁  
    lock.unlock();  
}
3. 释放锁
在访问完共享资源后,你必须在 finally 块中调用 unlock() 方法来释放锁。这是非常重要的,以确保即使在发生异常时锁也能被正确释放。

4. 尝试非阻塞地获取锁
ReentrantLock 还提供了 tryLock() 方法,它尝试获取锁,但如果锁不可用,则不会阻塞当前线程,而是立即返回 false。

java
if (lock.tryLock()) {  
    try {  
        // 访问或修改共享资源的代码  
    } finally {  
        lock.unlock();  
    }  
} else {  
    // 无法获取锁时的处理逻辑  
}
5. 可中断地获取锁
ReentrantLock 还提供了 lockInterruptibly() 方法,它允许在等待锁的过程中被中断。如果当前线程在等待锁的过程中被中断,则会抛出 InterruptedException。

java
try {  
    lock.lockInterruptibly();  
    try {  
        // 访问或修改共享资源的代码  
    } finally {  
        lock.unlock();  
    }  
} catch (InterruptedException e) {  
    // 处理中断逻辑  
    Thread.currentThread().interrupt(); // 保留中断状态  
}
6. 尝试获取锁时设置超时时间
ReentrantLock 还提供了 tryLock(long timeout, TimeUnit unit) 方法,它尝试在给定时间内获取锁。如果在这段时间内成功获取了锁,则返回 true;如果在指定时间内没有获取到锁,则返回 false。

java
if (lock.tryLock(10, TimeUnit.SECONDS)) {  
    try {  
        // 访问或修改共享资源的代码  
    } finally {  
        lock.unlock();  
    }  
} else {  
    // 无法在指定时间内获取锁时的处理逻辑  
}
注意事项
确保在 finally 块中释放锁,以避免死锁。
ReentrantLock 是可重入的,即同一个线程可以多次获取同一个锁。但是,每次获取锁后都必须释放相应次数的锁。
使用 ReentrantLock 时,可以考虑使用条件变量(Condition),它提供了比 Object 监视器方法更灵活的线程间通信方式。

 

标签:try,同步,处理,lock,代码,ReentrantLock,共享资源,获取,finally
From: https://www.cnblogs.com/Mr-Y1907/p/18397894

相关文章

  • 在 SQLAlchemy 中对数据异步处理的时候,获得关联集合的处理方式
    我们在定义SQLAlchemy对象模型的关系的时候,用到了relationship来标识关系,其中lazy的参数有多种不同的加载策略,本篇随笔介绍它们之间的关系,以及在异步处理中的一些代码案例。1、在SQLAlchemy中定义关系在SQLAlchemy中,relationship()函数用于定义表之间的关系(如one-to-ma......
  • 网站提示“503 Service Unavailable:服务器暂时无法处理请求”错误如何解决
    当您遇到“503ServiceUnavailable:服务器暂时无法处理请求”的错误时,这表示服务器当前不能处理请求,但预计稍后可以恢复。这可能是由于服务器过载、正在进行维护、配置错误或其他暂时性问题。以下是解决此类问题的一些步骤:检查服务器负载:确认服务器是否过载。如果服务器资源(......
  • 解决VSCode 使用git拉取前端代码报错问题,屏蔽不参与git提交的文件,git rm --cached,git
    问题描述:`最近,在公司共同开发Angular前端项目过程中,我使用的开发工具时VSCode,遇到一个问题,比如environment.js,package-lock.json,angular.json等等文件都是不需要上传的,别人上传了,我也不想覆盖的文件,你懂吧。但是呢,我一拉代码,就会提示有冲突,要我解决,不然拉不了,有个蠢办法就......
  • gitee创建仓库如何提交代码
    在gitee上创建了仓库之后如何将项目与仓库关联起来,提交代码?1、如何创建仓库登录gitee,在导航栏找到新建仓库然后是设置仓库,填入名称以及自定义路径,点击创建注:如果选择了初始化仓库,仓库创建之后直接就是第一次提交了,会看不到仓库给你的参考命令,不会关联仓库的小白可以不用管,直......
  • 机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研
    完整的论文代码见文章末尾以下为核心内容和部分结果摘要机器学习方法在电池寿命预测中的应用主要包括监督学习、无监督学习和强化学习等。监督学习方法通过构建回归模型或分类模型,直接预测电池的剩余寿命或健康状态。无监督学习方法则通过聚类分析和降维技术,识别电池数据......
  • 编译原理项目——C++实现C语言编译器输出为gcc级汇编(代码/报告材料)
    完整的代码材料见文章末尾以下为核心内容和部分结果项目介绍function.cpp实现了共有的函数lexer.cpp词法分析器get_predict_table.cpp获取预测分析表LR.cpp语法分析generate.cpp语义分析中间代码生成to_asm.cpp目标代码生成部分核心代码LR分析#include"co......
  • 花指令处理
    题目https://files.buuoj.cn/files/23766843c5b14f1bcc1e9e00e3a761db/attachment.zip这里的jnz指令会实现一个跳转.text:0040102Ecallnearptr0EC85D78Bh0EC85D78Bh被标红了,是一个不存在的地址,导致IDA无法正常反汇编所以需要Nop掉(十六进制90)选......
  • 14-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-STM32+ML307以SSL单向认
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明安装的MQ......
  • MySQL零基础入门教程-5 单行处理函数、分组函数、mysql关键字执行顺序,基础+实战
     教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第五篇17、单行数据处理函数P30-36&分组函数17.1、数据处理函数又被称为单行处理函数单行处理函数的特点:一个输入对应一个......
  • 狐狸算法(FOX)优化BP神经网络原理及Matlab代码
    目录0引言1数学模型2优化方式3Maltab代码3.1伪代码3.2FOX主函数代码3.3FOX-BP4视频讲解0引言狐狸算法(Foxoptimizer,FOX)是由HardiMohammed在2023年提出群智能算法,该算法模拟了自然界中狐狸在捕猎时的觅食。FOX基于测量狐狸和猎物之间的距离来执行有效的跳......