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

【多线程】震惊~这是我见过最详细的ReentrantLock的讲解

一.与synchronized相比ReentrantLock具有以下四个特点:

  • 可中断:synchronized只能等待同步代码块执行结束,不可以中断,强行终断会抛出异常, 而reentrantlock可以调用线程的interrupt方法来中断等待,继续执行下面的代码。

  • 在获取锁时能够设置等待获取的时间: 调用lock.trylock(),参数可以设置等待的时间,如果在规定等待的时间里拿到了锁,就返回True,否则返回false,不会阻塞等待,代码会继续执行后续操作。

  • 能够实现公平锁和非公平锁:公平锁其实是为了解决饥饿问题,当一个线程由于优先级太低的时候,就可能没有办法获取到时间片

  • 可以支持多个变量:对于synchronized,搭配wait/notify来唤醒等待线程,对于keentrantLock,搭配Condition类,功能比wait/notify略强一点, synchronized唤醒时是随机唤醒一个,而Condition而言可以指定一个线程进行唤醒.

二.简单介绍一下ReentrantLock

ReentrantLock翻译成中文,表示可重入锁,与synchronized一样,都是属于可重入锁。

可重入锁,也叫做 递归锁,从名字上理解,字面意思就是再进入的锁,重入性是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,首先他需要具备两个条件:

  • 线程再次获取锁:所需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次获取成功
  • 锁的最终释放:线程重复n次获取了锁,随后在第n次释放该锁后,其它线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前线程被重复获取的次数,而被释放时,计数自减,当计数为0时表示锁已经成功释放。
ReentrantLock 源码分析

在这里插入图片描述

http://www.lryc.cn/news/331410.html

相关文章:

  • 分布式链路追踪与云原生可观测性
  • CSS3新增的语法(三)【2D,3D,过渡,动画】
  • Flutter应用在苹果商店上架前的准备工作与注意事项
  • 如何开启MySQL的binlog日志
  • 设计模式|状态机模式(State Machine Pattern)
  • Django源码之路由的本质(上)——逐步剖析底层执行流程
  • 基于深度学习的植物叶片病毒识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)
  • Native Instruments Kontakt 7 for Mac v7.9.0 专业音频采样
  • yolov8训练流程
  • Java基础学习: Forest - 极简 HTTP 调用 API 框架
  • Pandas Dataframe合并连接Join和merge 参数讲解
  • ABC318 F - Octopus
  • Docker实战教程 第3章 Dockerfile
  • JSON在量化交易系统中的应用
  • x-cmd-pkg | broot 是基于 Rust 开发的一个终端文件管理器
  • 设置asp.net core WebApi函数请求参数可空的两种方式
  • Vue.js组件精讲 开篇:Vue.js的精髓——组件
  • R语言中的常用数据结构
  • 基于Python的微博旅游情感分析、微博舆论可视化系统
  • 机器学习的模型校准
  • 0.17元的4位数码管驱动芯片AiP650,支持键盘,还是无锡国家集成电路设计中心某公司的
  • 【C++】编程规范之内存规则
  • 并发编程之线程池的应用以及一些小细节的详细解析
  • 基于JSP的农产品供销服务系统
  • redis之主从复制、哨兵模式
  • 【随笔】Git 基础篇 -- 分支与合并 git rebase(十)
  • 图像识别技术在体育领域的应用
  • 【项目新功能开发篇】开发编码
  • 软件设计原则:开闭原则
  • Python如何下载视频