可重入锁-Reentrant

2023-11-05

Reentrant = Re + entrant : 可重复进入

什么叫可重入:线程可以进入任何一个它已经拥有的锁所同步着的代码块。

可重锁作用:防止死锁

常用的可重入锁:

JDK:ReentrantLock (java.util.concurrent.locks.ReentrantLock)

JVM: Synchronize

public class SynchronizeTEst {

    private int a=0;

    // 锁的是当前对象
    public synchronized void add(){
        a++;
        System.out.println("-------: "+a);
        //已获得锁,再调用desr,同一个线程同一把锁, 直接进去。
        decr();
    }

    // 锁的是当前对象
    public synchronized void decr() {
        a--;
        System.out.println("-------: "+a);

    }

    public static void main(String[] args) {
        SynchronizeTEst synchronizeTEst=new SynchronizeTEst();
        synchronizeTEst.add();
        synchronizeTEst.decr();
    }
}

ReentrantLock:

abstract static class Sync extends AbstractQueuedSynchronizer {}

static final class NonfairSync extends Sync {}

static final class FairSync extends Sync {}

(1)抽象类Sync实现了AQS的部分方法;

(2)NonfairSync实现了Sync,主要用于非公平锁的获取;

(3)FairSync实现了Sync,主要用于公平锁的获取。

// true - 公平锁; 按获取锁的顺序排队等待锁
// false -非公平锁(默认);直接获取锁,不排队
ReentrantLock reentrantLock = new ReentrantLock(true);

eg:

public static void main(String[] args) {
        ReentrantLock lock=new ReentrantLock(true);
        Runnable runnable = ()->{
            try {
                lock.lock();
                for (int i=0;i<10;i++){
                    Thread thread=Thread.currentThread();
                    System.out.println("....:"+thread.getName()+",out:"+ i);
                    //TimeUnit.MILLISECONDS.sleep(200);
                }
            } finally {
                lock.unlock();
            }
        };
        List<Thread> lst=new ArrayList<>();
        //5个线程依次按顺序输出
        for (int i =0 ;i<5;i++){
            lst.add(new Thread(runnable,"T"+i));
        }
        for (int i =0 ;i<5;i++){
            lst.add(new Thread(runnable,"R"+i));
        }
        lst.forEach(e-> e.start());
    }

ReenTrantLock独有的能力:

  • ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
  • ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
  • ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

总结

  • 可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。与可重入锁相反,不可重入锁不可递归调用,递归调用就发生死锁。
  • 隐式锁(即synchronized关键字使用的锁)默认是可重入锁,显式锁(即Lock)也有ReentrantLock这样的可重入锁。
  • 可重入锁的工作原理很简单,就是用一个计数器来记录锁被获取的次数,获取锁一次计数器+1,释放锁一次计数器-1,当计数器为0时,表示锁可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可重入锁-Reentrant 的相关文章

  • 在游戏框架中编写功能测试的正确方法

    在为基于 play1 2 4 的 web 应用程序编写功能测试时 我对如何正确编码感到有点困惑 困惑在于所涉及的事务边界 我在某处读到每个测试都有自己的事务 在我的应用程序中 用户可以登录并向购物车添加一些商品 然后他可以提供一个地址 以便
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • 使用不同的组合器和累加器进行流缩减的示例

    问题是关于java util stream Stream reduce U identity BiFunction
  • Spring MVC 中的 CSRF(跨站请求伪造)保护

    我对春季的 CSRF 跨站请求伪造 保护有点困惑 不 我有我的 jsp 我的控制器和一个 Web 服务 我想要做的是在 Web 服务级别验证令牌 如果令牌匹配 则运行 Web 服务 在我的例子中执行数据库插入 JSP file
  • Java:BufferedInputStream 的 available() 方法存在问题

    我正在处理以下代码 用于将大文件拆分为一组较小的文件 FileInputStream input new FileInputStream this fileToSplit BufferedInputStream iBuff new Buff
  • JSF 错误 - IllegalStateException:PWC3999:提交响应后无法创建会话[重复]

    这个问题在这里已经有答案了 我是 JSF 新手 正在构建一个使用 Facelet 创建的应用程序 这是我的模板master xhtml
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 当用户使用相同的凭据登录两次时如何使用户会话无效

    我正在使用带有 Richfaces 和 Facelets 的 JSF 1 2 我有一个应用程序 其中包含许多会话范围的 Bean 和一些应用程序 Bean 假设用户使用 Firefox 登录 创建一个会话 ID A 然后他打开 Chrome
  • Java中的运算符重载和覆盖

    运算符重载和运算符重写有什么区别 它们在继承和控制台程序中是否相同 Java 不支持运算符重载和重写 检查以下引用自的描述 http java sun com docs white langenv Simple doc2 html http
  • Java Swing JEditorPane:操作样式文档

    我的模型是与枚举类型关联的字符串队列 我试图在 JEditorPane 中显示该模型 队列中的每个元素作为一个单独的 HTML 段落 其属性基于关联的枚举类型 但是 我的更新方法并没有达到我想要的效果 我尝试将 HTML 字符串直接写入文档
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 如何在Android中使用资源

    一个人如何使用资产 我有这个代码 AssetManager assets getAssets InputStream stream assets open test txt 看起来它只能在 Activity 类中使 用 如果我尝试在另一个类
  • 无法从 ViewPager 中的 Fragment 编辑 ActionBar 标题

    我有一个Activity它通过一个托管多个片段ViewPager 在活动的onCreate方法我使用以下代码来更改ActionBar title Toolbar toolbar findViewById R id toolbar setSu
  • C3P0:生产中未返回的连接超时?

    参数unreturnedConnectionTimeout给定时间段后未返回的连接超时 我正在尝试决定是否应该在我的制作中使用它persistence xml 使用它的一大优点是连接池将能够从泄漏的连接中恢复 一个很大的缺点是泄漏的连接将很
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • 为什么我的 Java 路径中添加了“L”?

    我在我的类路径中加载了一个 jar 在 iReport 中 如果重要的话 我确信它具有所需的方法 但是当我尝试测试连接 从而调用该 jar 时 我得到一个 java lang NoSuchMethodError 说它正在引用班上 Lorg
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • Java分数计算器

    我对 Java 编程还很陌生 我的 AP 计算机编程课程有作业要完成 所以请耐心等待 我必须弄清楚如何将两个分数相乘 我想知道是否有任何方法可以在方法内部声明变量并在该方法外部使用它 我在介绍方法中的 while 循环 谢谢您 希望这不会令
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System

随机推荐

  • vue 使用table2excel导出excel表格(带图片)

    如想要实现导出功能 并且可以导出图片 如下图效果 下面直接上步骤 下载安装插件 安装命令 npm install js table2excel 引入插件 在需要用到的页面引入插件 如下图 使用插件 直接上代码 onBatchExport方法
  • java项目部署到linux系统上出现java.lang.OutOfMemoryError: PermGen space错误

    http blog csdn net wyzfairy article details 37879509 今天一个之前运行没问题 在本地测试页没问题的Java项目部署到Linux系统之后 在登录时出现java lang OutOfMemor
  • Web前端-Vue ElementUI点击Table 索引行获取index处理

    需求 在table中row行 index 0 作为区头 数据字符展示 参考组件 Element The world s most popular Vue UI framework 1 table中有一个 row class name tab
  • git显示不出绿色的小图标的解决方法

    大家好 我是曜耀 今天我来为大家讲解一下 电脑安装git显示不了绿色的小图标的问题 对于刚刚安装了git的我们 有一部分会遇到在操作过程 win会显示不出 git该用的图标 对此我们会很烦恼 我也是其中一员 不过我在网上找了很多解决的方法
  • android版本下载地址 http,Android ADT下载地址(含各版本)

    Android ADT下载地址 含各版本 2019年12月04日 阅读数 26 这篇文章主要向大家介绍Android ADT下载地址 含各版本 主要内容包括基础应用 实用技巧 原理机制等方面 希望对大家有所帮助 ADT百度云下载连接 含各版
  • 服务器:在腾讯轻量级服务器上传jar包并运行jar

    前言 本期项目使用springboot开发 最终将项目生产的jar包需要上传至云服务器运行 方便自己的小程序端和web端去访问 本文将jar包的运行与主要命令进行说明 jar包生成 项目打包前 需要保证其正确性 最好先运行后在打包 具体的打
  • 针对 微信小程序 的 getUserInfo 接口废弃,不能弹出授权窗口的问题

    getUserInfo 接口废弃说明 官方给出的废弃getUserInfo接口的通知链接 小程序登录 用户信息相关接口调整说明 废弃时间 2021年4月28日以后 废弃后的使用情况 无法通过wx getUserInfo与
  • 从输入网址到页面呈现的详细过程

    面试题经典题目 简要回答如下 a 域名解析 b 发起TCP连接的三次握手 c 建立TCP连接后发起http请求 d 服务端响应http请求 返回响应报文 e 浏览器页面渲染 f 断开TCP连接 下面详细介绍 a 域名解析 DNS解析 当在浏
  • 计算机上的无线网络开关怎么打开,联想笔记本无线网络开关怎么打开

    当我们买到笔记本电脑的时候 我们会不会就会急着想上网看一下呢 女生会选择第一时间追一下剧 男生呢 就会想下载一个游戏来刺激一下 那消费者知不知道无线网络开关是怎么开的吗 下面小编就给大家说说联想笔记本无线网络开关怎么打开 打开无线网络开关的
  • 开发人员谈测试:如何写出简洁又规范的单元测试

    文章转载链接 http www 51testing com html 83 n 4480883 html 我们之前谈到过要让开发人员认识到测试的重要性并了解测试 本文的主要重点是针对日常开发阶段工程师可以做的事情 也就是单元测试而展开 编写
  • 分布式锁看这篇就够了

    https blog csdn net tzs 1041218129 article details 80086991 关注我 转载请务必注明原创地址为 http www 54tianzhisheng cn 2018 04 24 Distr
  • STM32外设系列—HC-05(蓝牙)

    文章目录 一 蓝牙简介 二 使用方法 2 1 接线 2 2 AT指令 三 蓝牙APP 四 实战项目 4 1 添加文件 4 2 配置需要传递的参数 4 3 获取返回值 4 4 发送光照强度 4 5 控制程序 4 6 手机端页面设计 4 6 1
  • python的学习心得与知识总结

    1 字符串格式化表达式 作用 生成一定格式的字符串 运算符 语法格式 格式字符串 参数值 或 格式字符串 参数值1 参数值2 参数值3 说明 左侧为格式格式字符串 右侧为参数值 当有多个参数值时用 括号 括起来 并用逗号 隔开 格式化字符串
  • 基于java的饮食分享平台系统毕业设计(源代码+数据库+部署文档+部署视频)

    摘要 本篇论文主要介绍了基于Java的饮食分享平台系统的设计与实现 通过对现有饮食分享平台的分析和用户需求的调研 本设计采用Java语言进行系统开和编码 首先分析了饮食分享平台的背景和相关知识 然后提出了系统的需求和设计方案 接着详细介绍了
  • 自定义解密注解

    在开发中 有时候会遇到前端body加密 后端解密操作 接下来用注解实现 1 新增DecodeRequestBodyAdvice类 package com xx advice import lombok extern slf4j Slf4j
  • 图卷积 节点分类_了解图卷积网络以进行节点分类

    图卷积 节点分类 Neural Networks have gained massive success in the last decade However early variants of Neural Networks could
  • 如何学习数学分析

    如何学习数学分析 数学分析的研究定位 一直以来都是书到用时方恨少 刚毕业那会学的是计算机 从事算法工程师岗位 然后基础人工智能算法 在遗传BP 神经网络 旅行商问题上接触了很多数学知识 到后来的机器人导航工程师又做了路径规划 设计到视觉SL
  • 1.pwn基础总结

    基本概念 exploit 用于攻击的脚本与方案 通常缩写为exp payload 攻击载荷 是的目标进程被劫持控制流的数据 shellcode 调用攻击目标的shell的代码 打开目标的shell 获取目标控制权 pwn解题基本流程 che
  • CBC字节翻转攻击解析

    CBC字节翻转攻击解析 一 分组密码的模式 分组密码的主要模式有5种 ECB模式 电子密码本模式 Electronic CodeBook mode CBC模式 密码分组链接模式 Cipher Block Chaining mode CFB模
  • 可重入锁-Reentrant

    Reentrant Re entrant 可重复进入 什么叫可重入 线程可以进入任何一个它已经拥有的锁所同步着的代码块 可重锁作用 防止死锁 常用的可重入锁 JDK ReentrantLock java util concurrent lo