Synchronized和ReentrantLock的对比学习

Java并发编程系列-Synchronized 和显示锁 Lock 的实现原理 1. Synchronized 字节码分析 前面我们已经知道了 Synchronized 在使用的时候有两种方式,一种修饰方法,一种是同步块的方式。 示例:1 public class SyncDemo { public synchronized void a() { // } public void b() { synchronized(this) { //code } } } 可以看出示 阅读详情

    Synchronized和ReentrantLock都只有在多线程情况下才会被使用,多线程我有两种理解,一种是一个类的一个实例对象被启动了多个线程,这样其每个线程就共享了这个实例对象的所有实例变量;还有一种是一个类被初始化了多个实例对象,每个实例对象被启动了一个线程,那么每个线程所拥有的实例变量彼此之间是独立的(但是他们的某个实例对象可能是同一个另一个类的实例对象(另一块相同的堆内存空间)),也就是他们不共享同一段堆内存。这两种情况在多线程情况下都会出现对同一资源的竞争关系,Synchronized和Lock都是解决这一临界区问题的方法。还有对于多线程我觉得要实际情况实际对待,到底是使用Synchronized还是使用Lock,没有唯一的答案,但有最优的方法,所以你在比较学习这两种同步手段时要视具体场景分析,没有绝对的谁优谁劣。

    Synchronized是java语言的一个关键字,使用它很简单,它可以作用在一个方法上,也可以作用在一段代码块上。synchronized出现同步一定是同一个对象作用在synchronized修饰的代码。synchronized的特性有以下几点:

    1、Synchronized是可重入锁,就是一个线程可以在一个对象的synchronized的方法中访问这个对象的其他synchronized方法。

    2、Syschronized还是不可中断锁和非公平锁。

    3、Synchronized锁的释放是jvm完成,当synchronized作用的代码块执行完毕或抛出异常时,jvm就会释放锁,但是其它情况如线程IO等待、睡眠等被阻塞时,synchronized锁是不会被释放的,如果一直被阻塞,锁一直不会被释放。

    4、Synchronized如果修饰类普通方法或代码块,就是对象锁,如果同步方法也是静态(static)方法,就是其所在类的类锁,这点需要注意。

    5、当synchronized配合使用Object对象提供的wait()、notify()、noifyAll()方法时,这些方法需要放在synchronized修饰的代码内,否则JVM会抛出IllegalMonitorStateException异常,因为这些方法被调用时会释放当前线程的锁,所以线程在调用这些方法时先要获取锁。

    6、线程通过synchronized去同步,没有办法去判断这个线程是否获取到锁。

    ReentrantLock是java.util.concurrent.locks包下的类,实现了Lock接口,由大名鼎鼎的Doug Lea所写。

    ReentrantLock的特性有以下几个特性:

    1、使用ReentrantLock都是代码里显示去获取锁,也必须显示(调用unlock())去释放锁。

    2、ReentrantLock有isLock()方法判断线程是否获取到锁。

    3、ReentrantLock是可重入锁,可中断锁,默认(new ReentrantLock())是非公平锁,但也可将其声明为公平锁。

    4、ReentrantLock获取锁的类型比较灵活。当使用lock()方法获取锁时,如果锁被其他线程获取到,则其线程会一直等待,直到能获取到锁,跟synchronized类似。当使用tryLock()去获取锁时,如果该线程获取到锁,则会返回ture,否则返回false。这个结果是立即返回的,这样表达是为了与ReentrantLock的令一种类似的获取锁的方法区分开,就是tryLock(long time, TimeUnit unit),这个方法看参数也能猜出来它的功能了。用这种两种方法在没有获取到锁时,之后要做什么,就由程序员自己根据自己的需求去写了。当使用lockInterruptibly()获取锁时,ReentrantLock就是可中断锁,顾名思义,当一个线程未获取到锁处于阻塞状态时,这个线程是可以被中断的,即抛出中断异常,程序继续往下运行,这个中断是要在代码里调用Thread类interrupt()方法去触发的,同时需要注意的是如果这个线程获取到了锁,它是没有办法被中断的。

    5、ReentrantLock还实现了Lock定义的newCondition()方法功能,也即在Lock中使用多条件,有时候为了实现某些需求,需要多个线程配合,如生产者-消费者模型,它需要某些线程在某些时刻处于阻塞状态,不要再工作了,同时在必要时刻能被唤醒。对的,Object类就提供了实现这种功能的方法,而ReentrantLock也提供了这种功能,就是newCondition()方法,这个方法返回的时Condition接口,ReentrantLock调用newCondition()方法返回的是ConditonObject对象,这个类就实现了Condition接口。

    Lock接口实现类中还有常用的就是读写锁ReentrantReadWriteLock,这个跟本文比较的两种同步方法没什么关系,但读写锁也是一种锁,也可以用于同步,只是这种锁分读锁和写锁,将锁按功能分的更细,用于对读写比例失衡的并发程序有很大的使用价值,可以提高程序效率。这种读写锁,读锁和读锁是可以同时访问的,但读锁和写锁、写锁和写锁是互斥的。因为这种锁的功能明确,所以读锁中不要去更新临界区的数据,不然程序会出数据问题的。

    以上就是synchronized和lock主要功能和用法,虽然是分开介绍,但从文中可以很容易找到他们之间的相同点和区别。

Matlab实战:如何用MMG方程预测船舶轨迹(附完整代码) 本文提供了一份基于MMG方程的Matlab实战指南,详细讲解了如何从零构建船舶轨迹预测模型。内容涵盖MMG模型的核心原理、Matlab代码框架设计、动力学函数实现、参数调优与验证方法,并附有完整代码示例,帮助工程师和研究者快速掌握这一船舶操纵性预测的关键技术。 阅读详情

相关推荐

IC 时钟设计核心问题与高质量系统设计指南(附源码)

本文深入探讨了IC时钟设计的核心问题与高质量系统设计方法。时钟系统作为IC的"心脏",其性能直接影响时序稳定性、功耗效率和可靠性。文章从五个维度展开分析:时钟源选择与性能匹配、时钟分配网络设计、抖动抑制、多时钟域管理和功耗优化。针对高质量时钟系统设计,提出了时钟源优化、时钟树结构优化、干扰抑制与仿真验证等具体方法。同时,系统阐述了时钟与复位的协同设计关系,强调异步复位同步释放等技术的重要性。文章还总结了高质量IC系统设计的综合要点,包括电源/信号完整性、时序功耗平衡、可靠性设计及全流程验

Open 1060

锁系列—Synchronized和ReentrantLock对比

一、 synchronized 1.三种使用方式 修饰实例方法:给对象实例加锁。 修饰静态方法:给当前类加锁。 修饰代码块:指定加锁对象(类或者指定对象)。 2.底层原理(jvm层面) (1)修饰代码块 synchronized 同步语句块使用的是 monitorenter(对应JMM模型lock指令) 和 monitorexit (unlock)指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。 **当执行 monitorent

lans_g的博客 2415

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 420

Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)

这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高...

zxd8080666的博客 11万+

手把手教你用ZLMediaKit搭建WebRTC直播:本地推流与播放实战

本文详细介绍了如何使用ZLMediaKit搭建WebRTC直播系统,涵盖从环境准备、编译部署、SSL证书配置到本地推流与播放的完整实战流程。通过一步步的指导,帮助开发者快速掌握基于ZLMediaKit的WebRTC推拉流技术,构建低延迟的实时音视频应用。

weixin_28842367的博客 348

ESP32基于Arduino环境开发128*160 TFT_LCD屏幕显示照片

ESP32基于Arduino环境开发128*160 TFT_LCD屏幕显示照片

weixin_42854045的博客 2059

Synchronized和ReentrantLock的区别

1.Synchronized和ReentrantLock的区别 ​ ①ReentrantLock显示地获得,释放锁,synchronized隐式获得释放锁 ​ ②ReentrantLock可响应中断,可轮回,synchronized是不可以响应中断的 ​ ③ReentrantLock是API级别的,synchronized是JVM级别的 ​ ④ReentrantLock可以实现公平锁 ​ ⑤ReentrantLock通过Condition可以绑定多个条件 ​ ⑥底层实现不一样,synchronized是同步

qq_19667981的博客 2万+

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

synchronized和ReentrantLock的区别

synchronized和ReentrantLock的区别 共同点: ​ 1.都是用来协调多线程对共享对象、变量的访问 ​ 2.都是可重入锁,同一线程可以多次获得同一个锁 ​ 3.都保证了可见性和互斥性 不同点: ​ 1. ReentrantLock显示地获得,释放锁,synchronized隐式获得释放锁 ​ 2. ReentrantLock可响应中断,可轮回,synchronized是不可以响应中断的 ​ 3. ReentrantLock是API级别的,synchronized是JVM级别的 ​ 4.

淮水竹亭 3033

C#部署YOLO三种方案深度实测:OpenCV DNN vs ONNX Runtime vs TensorRT

在工业视觉项目落地阶段,C#生态下部署YOLO模型主要有三条技术路线。很多开发者仅凭经验选型,往往在部署后期踩中性能瓶颈、兼容故障、维护成本超标的坑。本文基于工控机常见硬件配置,针对YOLOv8系列模型做控制变量实测,从推理性能、部署难度、工业稳定性、综合成本等多个维度做横向对比,给出可直接落地的选型结论。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 466

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1937

synchronized和ReentrantLock

一、线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突。 如下例:假设有一个卖票系统,一共有100张票,有4个窗口同时卖。 public class Ticket implements Runnable { // 当前拥有的票数 private int n

xiaoyaotan_111的博客 989

goahead(嵌入式Web服务器)之openssl 应用篇

1、环境配置 在me.h文件里修改以下宏定义 ME_COM_MBEDTLS 0 ME_COM_MATRIXSSL 0 ME_COM_NANOSSL 0 ME_COM_OPENSSL 1 2、添加 goahead-openssl.c goahead-openssl.c这个文件在有些goahead源码中是没有的,后面的章节中会提供openssl应用测例 3、依赖的库 goahead的openssl 应用需要依赖libssl.a与libcrypto.a(libssl.so与libcrypto.so)两个库,做好

weixin_40732273的博客 2089

大厂高频面试题:ReentrantLock 与 synchronized异同点对比

ReentrantLock与 synchronized这两种Java并发使用频率最高的同步锁,在很多大厂面试题中有个经典考题:ReentrantLock 与 synchronized异同点对比!今天我们针对这一考题来做一个尽可能全面的总结哈。

2401_84208172的博客 690

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

synchronized和ReentrantLock有什么区别呢?

从今天开始,我们将进入Java并发学习阶段。软件并发已经成为现代软件开发的基础能力,而Java精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发基本功也成为各个公司面试Java工程师的必选项。今天我要问你的问题是, synchronized和ReentrantLock有什么区别?有人说synchronized最慢,这话靠谱吗?

qq_33240556的博客 766

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java核心技术面试精讲第15讲 | synchronized和ReentrantLock有什么区别呢?

从今天开始,我们将进入Java并发学习阶段。软件并发已经成为现代软件开发的基础能力,而Java精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发基本功也成为各个公司面试Java工程师的必选项。今天我要问你的问题是, synchronized和ReentrantLock有什么区别?有人说synchronized最慢,这话靠谱吗?

牛牛 771

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java多线程系列--Synchronized和ReentrantLock区别

叙述java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。Synchronize和ReentrantLock。

2401_84558452的博客 995

【Java面试笔记:进阶】15.synchronized和ReentrantLock有什么区别呢?

synchronized 和 ReentrantLock 都是 Java 并发编程中的重要工具,但它们在灵活性、功能和性能上各有优劣。在选择锁机制时,应根据具体需求和场景进行权衡,同时注意代码的可维护性和可读性。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1216

ReentrantLock

1、标题、分类 2、正文 附带源码,版本1.8 零、开头介绍(红涛) 一、简短的对比Synchronized,增加使用场景(吴磊) 二、示例代码,贴合场景(盼盼) 三、源码解读 Lock、ReentrantLock API源码(晓萱) AQS(红涛) CAS思想、问题、在哪用(进福) 四、最终总结:短小精湛的总结(盼盼) ...

m0_58186166的博客 364

Java面试题二:synchronized 和 volatile 、ReentrantLock

在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。

2401_83946570的博客 885

Synchronized和 ReentrantLock有什么区别?

Synchronized和 ReentrantLock有什么区别?

水w的博客 2573

synchronized 和 ReentrantLock 的区别

是关键字,底层由 JVM 直接实现,代码简洁,自动释放锁,适合简单同步逻辑。是类,功能更强大,支持中断、公平、定时获取锁、多条件变量等,但需要手动释放锁。从 JDK1.6 开始性能大幅优化,常规使用场景下不输。若需要更精细的控制同步逻辑或用于并发度很高的系统,更适合。

m0_73748193的博客 1291

Synchronized和ReenTrantLock的对比

Synchronized和ReenTrantLock对比两者都是可重入锁synchronized 依赖于 JVM 而 ReenTrantLock 依赖于 APIReenTrantLock 比 synchronized 增加了一些高级功能性能已不是选择标准 两者都是可重入锁 两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,...

JustinNeil的博客 509

ReentrantLock和 synchronized

synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为 轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

刘皇叔说Java的博客 816

Java并发编程:深入对比synchronized与ReentrantLock

本文将深入对比Java并发编程中的两种同步机制:synchronized与ReentrantLock。synchronized是Java内置关键字,使用简单但功能有限;ReentrantLock是显式锁,提供更丰富的特性如公平锁、可中断获取和条件变量。两者都是可重入的,在性能上差异不大。synchronized适合简单同步场景,而ReentrantLock更适合需要高级特性的复杂场景。文章详细分析了两者的实现原理、使用方式及适用场景,并给出了最佳实践建议,帮助开发者根据实际需求做出合理选择。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1042

ReentrantLock和synchronized的对比

ReentrantLock和synchronized的对比 相同点 1、独占 ReentrantLock和synchronized都是独占锁,只允许线程互斥的访问临界区。但是实现上两者不同:synchronized加锁解锁的过程是隐式的,用户不用手动操作,优点是操作简单,但显得不够灵活。一般并发场景使用synchronized的就够了;ReentrantLock需要手动加锁和解锁,且解锁的操作尽量...

weixin_28985161的博客 383
上一篇: HTTPS连接流程回顾
下一篇: java基础-集合篇
一只青牛
博客等级 码龄10年 3粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值