本文为博主原创,未经允许不得转载:

ReentrantLock 是一种内置锁,也叫可重入锁(ReentrantLock),它允许线程再次获取已持有的同步锁,这样防止死锁的发生。在使用ReentrantLock时,需要手动获取和释放同步锁,即使出现异常,也一定要保证每次获取和释放同步锁的次数一致。

ReentrantLock 的主要特点如下:

  1. 可重入性:同一线程可以进入获取同步锁,也可以再次获取持有的同步锁。

  2. 可中断性:在等待获取同步锁的线程可以响应中断,也就是当线程处于等待获取同步锁的状态时,可以中断等待,它不会永久长时间等待下去。

  3. 公平锁:锁获取是公平的,多个线程通过 ReentrantLock 获取锁时,会先进入同步队列中,按照顺序获取同步锁,减少了线程间的竞争。

使用ReentrantLock的步骤:

  1. 创建ReentrantLock对象,通过构造方法可以选择公平锁或非公平锁;

  2. 在需要同步的代码块中,在使用ReenrantLock的lock()方法获取同步锁,在同步代码块执行完之后必须手动释放同步锁,否则会出现死锁的现象;

  3. 对于可能抛出异常的同步代码块,在finally中一定要释放同步锁。

示例代码:

ReentrantLock lock = new ReentrantLock();  // 创建ReentrantLock对象
try {
lock.lock(); // 获取同步锁
// 同步代码块
} finally {
lock.unlock(); // 释放同步锁
}

可重入锁的示例说明

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {

    private static final ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
new Thread(() -> {
lock.lock(); // 获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 获取锁");
doSomething(); // 调用可重入方法
} finally {
lock.unlock(); // 释放同步锁
}
}, "Thread-1").start(); new Thread(() -> {
lock.lock(); // 获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 获取锁");
doSomething(); // 调用可重入方法
} finally {
lock.unlock(); // 释放同步锁
}
}, "Thread-2").start();
} public static void doSomething() {
lock.lock(); // 再次获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 再次获取锁,并执行业务逻辑");
} finally {
lock.unlock(); // 释放同步锁
}
}
}

  在该示例中,创建了一个静态的ReentrantLock对象。两个线程分别获取同步锁,调用了一个可重入方法doSomething(),该方法中又再次获取了同步锁,这样就实现了可重入性。注意,在使用ReentrantLock时,必须手动获取和释放同步锁,避免出现死锁。

ReentrantLock 可重入锁总结的更多相关文章

  1. ReenTrantLock可重入锁(和synchronized的区别)总结

    ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...

  2. ReentrantLock可重入锁的理解和源码简单分析

    import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author ...

  3. ReenTrantLock可重入锁和synchronized的区别

    ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入 ...

  4. JUC 一 ReentrantLock 可重入锁

    java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...

  5. java ReentrantLock可重入锁功能

    1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static ...

  6. ReentrantLock——可重入锁的实现原理

    一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lo ...

  7. 40 多线程(十二)——ReentrantLock 可重入锁

    我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...

  8. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  9. ReentrantLock可重入锁——源码详解

    开始这篇博客之前,博主默认大家都是看过AQS源码的~什么居然没看过猛戳下方 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础 全网最详细的Abstra ...

  10. ReentrantLock可重入锁的使用场景(转)

    摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些. 场景1:如果发现该操作已经在执行中则不再执行(有状态执行) a.用在定时任务时,如果任务执行时间可能超过下次 ...

随机推荐

  1. ubuntu防火墙ufw基本使用方法

    ubuntu系统基本使用方法 防火墙 # 查看服务器防火墙状态 ufw status # 将防火墙设置为可用状态 ufw enable # 将防火墙设置为关闭状态 ufw disbale # 放行端口 ...

  2. Kernel Memory 入门系列:快速开始

    Kernel Memory 入门:Quick Start 了解了用户问答和文档预处理的流程之后,我们就可以直接开始使用Kernel Memory了. 1. 安装 项目中只需要通过NuGet安装Micr ...

  3. 微信模板消息 PHP

    微信SDK: <?php class Oauth { //获得全局access_token public function get_token(){ //如果已经存在直接返回access_tok ...

  4. 玩转Python:用Python处理文本数据,附代码

    Python 提供了多种库来处理纯文本数据,这些库可以应对从基本文本操作到复杂文本分析的各种需求.以下是一些常用的纯文本处理相关的库: str 类型: Python 内建的字符串类型提供了许多简便的方 ...

  5. ORA-28579 在从外部过程代理程序回调时,发生网络错误,ORA-06512 在"SDE.ST_GEOMETRY_SHAPELIB_PKG"

    如图所示,在执行sde.st_transform方法时报错. 环境是arcgis10.8  oracle是12C,版本号是v12.1.0.2.0 但是执行ST_GEOMETRY方法是可以的,说明配置没 ...

  6. Android 蓝牙使用

    原文地址: Android 蓝牙使用 - Stars-One的杂货小窝 公司项目需求需要实现监听蓝牙耳机连接,且要获取蓝牙耳机电量功能,翻了不少官方文档,记录下技术调研代码 注:本文没有研究蓝牙配对功 ...

  7. P1967 [NOIP2013 提高组] 货车运输 做题记录

    套路题了. 根据和角公式 \(\mathrm{\sin (\alpha + \beta) = \sin \alpha \cos \beta + \cos \alpha \cos \beta, \cos ...

  8. 使用Java 17中的record替代Lombok的部分功能

    在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用. 之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化.最近正好因为互相revie ...

  9. 物联网常见协议之Amqp协议及使用场景解析

    摘要:本文围绕AMQP协议,为大家详细解析AMQP协议.核心技术亮点.多协议之间的对比以及使用实践. 本文分享自华为云社区<物联网常见协议之Amqp协议及使用场景解析>,作者:张俭. 引言 ...

  10. 技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验

    摘要:通过对篮球动作的分类训练及识别检测实例的讲解和体验,使我们了解了Yolov3模型的原理.架构等基本知识,为日后的深入学习奠定了基础. 背靠全新的设计理念,华为云推出了 MindSpore深度学习 ...