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

Java面试篇基础部分- 锁详解

在这里插入图片描述

可重入锁

  可重入锁也叫作递归锁,是指在同一个线程中,在外层函数获取到该锁之后,内存的递归函数还可以获取到该锁。在Java语言环境下,ReentrantLock和Synchroinzed都是可重入锁的代表。

公平锁与非公平锁

  • 公平锁(Fair Lock)是指在分配锁之前检查是否有线程在排队等待获取到锁,优先将锁分配给排队时间最长的线程。
  • 非公平锁(Nonfair Lock)是指在分配锁的时候不考虑线程排队等待的情况,直接尝试获取锁的操作,在获取不到锁的情况下再排到队尾进行等待。如果获取到锁,则执行自己的业务逻辑。

  因为公平锁需要在多核的情况下维护一个锁线程的等待队列,基于该队列进行锁的分配,因此效率比非公平锁要低很多。Java中Synchroinzed就是非公平锁,ReentrantLock默认的lock方法采用的也是非公平锁。

读写锁:ReadWriteLock

  在Java中通过Lock接口以及其子类对象提供了方便对对象进行加锁和释放锁。但是这种锁是不能区分读写的。所以叫做普通锁。为了提高I/O性能,Java提供了读写锁机制。

  读写锁分为读锁和写锁两种,多个读锁之间是不互斥的,读锁与写锁互斥。在读的地方使用读锁,在写的地方使用写锁,在没有写锁的情况下,读锁是无阻塞的。

  如果系统的要求是共享数据可以同时支持多线程并发读的操作,但不能支持多线程并发写,那么使用读锁机制可以很大程度上增加读取效率;如果系统对于共享数据在同一时只能由一个线程进行写操作,并且在写的过程中不能进行读取,那么这个时候就需要使用写锁。因为读写锁之间是互斥的,所以说如果有写锁的话,读锁是没有办法进入的。

  一般的情况下,分别定义一个读锁,一个写锁,在读取共享数据的时候使用读锁,在使用完成之后释放读锁,在写共享数据的时候使用写锁,在使用完成后释放写锁,在Java中提供了
java.util.concurrent.locks.ReadWriteLock的实现类ReentrantReadWriteLock来完成对读写锁的定义和使用。

import java.util.HashMap;  
import java.util.Map;  
import java.util.concurrent.locks.ReadWriteLock

http://www.kler.cn/news/319272.html

相关文章:

  • 数据结构——概论
  • CNN网络训练WISDM数据集:模型仿真及可视化分析
  • 人工智能:重塑未来的技术力量
  • ubuntu22.04取消开机输入密码(实测)
  • 一文说清楚ETL与Kafka如何实现集成
  • Windows 快捷键大全:提升工作效率的小技巧
  • 华为HarmonyOS地图服务 7- 在地图上绘制标记
  • HTTP(超文本传输协议)基础
  • Redis——持久化策略
  • 网络威慑战略带来的影响
  • 智谱清影 - CogVideoX-2b-部署与使用
  • 30个GPT提示词天花板,一小时从大纲到终稿
  • JavaScript类型判断(总结)
  • F5研究显示:企业加速IT发展,以充分挖掘生成式AI潜力
  • 基于 RealSense D435相机实现手部姿态检测
  • Imagen与其他生成模型的对比:DALL-E、Stable Diffusion、MidJourney
  • Markdown书写技巧深度解析
  • 赋能未来工厂:EasyCVR视频平台助力装备制造业迈向智能制造
  • Unity实现原始的发射子弹效果
  • Python+appium自动化+夜神模拟器inspector部署验证
  • TypeScript系列:第四篇 - typeof 与 keyof
  • 微信小程序06-综合项目点餐系统
  • 京准电钟:NTP网络校时服务器助力校园体育场馆
  • MySQL 8.0 与 8.4 主主同步
  • E+H超声波物位仪FMU42-ATB2A22A
  • 企业内训|华为昇腾智算中心深度技术研修-某智算厂商研发中心
  • mysql RR是否会导致幻读?
  • [Redis][事务]详细讲解
  • 激光粉尘传感器:筑牢粮仓安全防线,有效应对粮食粉尘爆炸高危风险
  • 为什么一定要学AI(Stable Diffusion)做设计? 会用AI和不会用AI的区别真的太大了!打工人一定要看!