Synchronized、ReentrantLock、ReadWriteLock 介绍

Synchronized 关键字

 介绍

 synchronized 是 Java 中的关键字,用于控制对共享资源的并发访问,提供了一种锁机制来保证共享资源在同一时刻只能被一个线程访问。

优点

  • 简单易用:作为语言的内置特性,使用方便。
  • 自动释放锁:当同步块执行完成后,锁会自动被释放,不需要手动操作。

缺点

  • 不够灵活:不支持公平锁,不能中断正在等待锁的线程。
  • 无法尝试获取锁:线程尝试获取锁时,如果锁被占用,会一直等待,无法设置超时。
  • 锁粒度较粗:锁的是整个类、对象或方法,可能会导致不必要的等待。

使用场景

  适用于代码简单、竞争不激烈的同步场景。

ReentrantLock

 介绍

ReentrantLockjava.util.concurrent.locks 包中的一个类,它提供了比 synchronized 更多的功能。

 优点

  • 高度灵活:支持尝试非阻塞地获取锁、可中断的锁获取等。
  • 支持条件变量:可以绑定多个 Condition 对象,实现复杂的线程同步。
  • 可选择公平锁:支持公平锁,按照线程等待的先后顺序分配锁。

 缺点

  • 需要手动释放锁:必须在 finally 块中释放锁,增加了编程复杂性。
  • 性能开销:相比于 synchronized,ReentrantLock 在某些情况下可能有更多的性能开销。

 使用场景

适用于需要高度并发控制、锁定时间长、条件同步等复杂场景。

ReadWriteLock

 介绍

ReadWriteLock 是一个接口,它包含一对锁,一个读锁和一个写锁,通过分离读和写操作来提高并发性能。

 优点

  • 读写分离:允许多个线程同时读,但只允许一个线程写,提高了并发性。
  • 适应读多写少场景:在读操作远远高于写操作的场景下,性能优于 synchronized。
  • ReentrantLock 允许锁的续租,即一个线程可以重复获取已经持有的锁

 缺点

  • 复杂性:编程相对复杂,需要正确管理读锁和写锁。
  • 锁升级问题:读锁无法直接升级为写锁,可能会导致死锁。

 使用场景

适用于读多写少的并发场景,如缓存系统。

 选择依据

 在选择同步机制时,应考虑以下因素:

  • 简单性:如果同步逻辑简单,可以优先考虑使用 synchronized。
  • 灵活性和功能需求:如果需要高度的灵活性和附加功能(如定时锁等待、公平性选择、条件变量等),应选择 ReentrantLock。
  • 读写操作的频率:如果系统是读多写少的,使用 ReadWriteLock 可以提高并发性,但需要注意避免写锁导致的读锁饥饿。
  • 性能:如果对性能有极高要求,可以通过基准测试来选择适合的锁。
  • 可维护性:更复杂的同步机制可能导致代码难以理解和维护,需要根据团队的熟悉程度和偏好来选择。

在实际应用中,通常需要根据具体的业务场景和性能要求来选择最合适的同步机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣题解】P94-二叉树的中序遍历-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P94-二叉树的中序遍历-Java题解🌏题目描述💡题解&#x1f30f…

鸿蒙原生应用/元服务开发-Stage模型能力接口(十)下

ohos.app.form.FormExtensionAbility (FormExtensionAbility) 系统能力:SystemCapability.Ability.Form 示例 import FormExtensionAbility from ohos.app.form.FormExtensionAbility; import formBindingData from ohos.app.form.formBindingData; import formP…

Miniconda 3 | 出发,探索Python

介绍 Miniconda 是 Anaconda 的精简版本,是一个轻量级的 Python 包管理工具和环境管理工具。 优势和功能主要包括: 轻量级和快速安装: Miniconda 相比 Anaconda 更小巧,只包含最基本的工具和包管理功能。安装速度更快&#xff0c…

三维点通用排序

前言 NWAFU 2021阶段二 C 一、题目描述 题目描述 在三维笛卡尔坐标系中,可以用X,Y,Z三个坐标分量表示三维空间中的一个点。现有一系列用X,Y,Z表示的三维点,需要对其按指定的X、Y或Z分量进行升序或降序排序。请用C语言实现这一排序过程,程序…

端口+目录扫描

目录 前言: 基础知识: 状态码: 2XX: 3XX: 4XX: 5XX: 消息头: 请求头: 响应头: 目录扫描: 接口扫描: 主机存活扫描: I…

如何预防cookie被盗用

1.设置Cookie的HttpOnly属性为true。 一般来说,跨站脚本攻击(XSS)最常见的攻击方式就是通过在交互式网站(例如论坛、微博等)中嵌入javascript脚本,当其他用户访问嵌有脚本的网页时,攻击者就能通过document.cookie窃取到用户cookie信息。如果网站开发者将cookie的httponl…

网页设计期末 建筑博物馆首页 HTML+CSS+js 完整代码(轮播图+瀑布流)

文章目录 前言:完整代码在总结处跳转!!! 描述:结果展示:部分代码演示:(完整代码在总结处跳转)总结:(完整代码在此处跳转) 前言&#x…

LINUX 解决系统卡死:扩大内存交换分区

最近电脑总是卡住,让我很是苦恼。运行程序时发现可能是内存占满之后导致界面卡住。下面是在我16G内存的电脑上折腾的过程与结果: 查看当前的交换内存大小free -m(单位:-m选项表示以兆字节(MB)为单位显示内…

C++面试宝典第11题:两数之和

题目 给定一个整数数组和一个目标值,请在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,要求时间复杂度为O(n)。可以假设每种输入只会对应一个答案,注意:不能重复利用这个数组中同样的元素。 解析 这道题主要考察应聘者对算法时间复杂度和空间复杂度的理解,时…

【JVM篇】Java是如何实现平台无关的?

Java是如何实现平台无关的? ✔️什么是平台无关性✔️平台无关性的实现✔️Java虚拟机✔️字节码✔️Java语言规范 ✔️扩展知识仓✔️平台无关性的好处✔️ 有哪些语言实现了平台无关?✔️Java中基本数据类型的大小都是确定的吗? ✔️什么是平台无关性 平台无关性就是一种语…

android 13 调整导航栏返回键和home键间距

定制android 13的圆形设备,底部导航栏的back , recent_app键都靠近两边导致只看到一个home键。 期望:调整back , recent_app 和home的间距,能让这个圆形屏幕的设备能按到back,recent_app按键 diff --git a/vendor/mediatek/prop…

(salutation称呼)Mr., Mrs., Miss, Ms., Mx.,Jr.,Sr.,II,III,IV 分别是什么意思

文章目录 前缀后缀 前缀 Mr.:先生 Mrs.:太太(已婚) Miss:小姐(未婚),但不严格,有的时候学生称呼女老师可以直接用这个词,不必管是否结婚。 Sir:也…

Net6 Core webApi发布到IIS

Net6 Core Api发布到IIS不同于webapi,依赖框架不同,配置也移至项目内Program.cs 一、发布到指定文件夹和IIS,不过注意IIS应用程序池选择的是 “无托管代码“ 在IIS管理器中点击浏览,访问接口路径报500.19,原因是所依赖…

机器学习之K-means聚类

概念 K-means是一种常用的机器学习算法,用于聚类分析。聚类是一种无监督学习方法,它试图将数据集中的样本划分为具有相似特征的组(簇)。K-means算法的目标是将数据集划分为K个簇,其中每个样本属于与其最近的簇中心。 以下是K-means算法的基本步骤: 选择簇的数量(K值)…

json转换(json与对象互转、json与list互转、JSONObject与Map互转)

目录 一、json与对象互转1、json转自定义对象2、json字符串转JSONObject 二、json与list互转1、list转JsonArray类型字符串2、JsonArray类型字符串转list 三、JSONObject与Map互转1、Map转JSONObj 一、json与对象互转 1、json转自定义对象 User user JSONUtil.toBean(jsonSt…

HTTP协议编程实战(一)实战一

http使用在应用层,http是单次连接,一次只能发送一个请求。http是一个无状态协议,他不会保存客户端的状态信息,从而提高运行效率,保持比较快的响应速度。http是一种面向对象的协议,允许传送任意数据类型的对…

【Linux 程序】1. 程序构建

文章目录 【 1. 配置 】【 2. 编译 】makefile编写的要点makefile中的全局自变量CMake编译依赖的库g编译 【 3. 安装 】 一般源代码提供的程序安装需要通过配置、编译、安装三个步骤; 配置。检查当前环境是否满足要安装软件的依赖关系,以及设置程序安装所…

2024年医院设备维修培训安排

在你还考虑该不该干的时候别人已经走好远了 小时候觉得忘带作业是天大的事,高中的时候,觉得考不上大学是天大的事,恋爱的时候,觉得跟喜欢的人分开是天大的事,到现在回头看看,那些难以跨过的山,…

1200PLC连接分布式IO组态编程应用

SMART PLC作为S7-1200PLC的智能IO从站设备组态和编程应用详细介绍请参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/130257474https://rxxw-control.blog.csdn.net/article/details/130257474这篇博客我们介绍S7-1200PLC和分布式IO连接组…

【C语言深度剖析——第一节(关键字1)】《C语言深度解剖》+蛋哥分析+个人理解

你未曾见过火光,难怪甘愿漂泊寒夜 本文由睡觉待开机原创,未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 首先简单介绍一下《C语言深度解剖》: 全书特点&am…