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

Java中的 Sychronized 锁和 ReentrantLock 锁的区别?除此之外还有那些锁?

一. Sychronized 和 ReentrantLock 的区别这是一个面试过程中经常会被问到的一道面试题。1sychronized 是一个关键字既可以定义在方法上也可以定义在方法内部 ReentrantLock 是接口 Lock 的一个实现类。2sychronized 会自动的加锁和释放锁 ReentrantLock 需要程序员手动lock()加锁和unlock()释放锁。3sychronized 底层是JVM层面的锁 ReentrantLock 是API层面的锁它是 Lock 接口的实现类。4sychronized是非公平锁 ReentrantLock可以选择公平锁或非公平锁。5sychronized 锁的是对象如果定义在方法上当方法不是静态方法时锁对象指的是 this,即指代当前调用者当方法是静态方法时所对象指的是当前类的字节码文件对象。锁信息保存在对象头中 ReentrantLock 通过代码中的 int 类型的 state 标识来标志锁的状态。6sychronized的执行效率略低于ReentrantLock锁在jdk1.6后引入锁分级策略效率差距拉 低只有大约20% ReentrantLock执行效率高功能全但是使用复杂二. 锁的分类我们在学习或网络上看文章通常会观察到公平锁、非公平锁、自旋锁、轻量级锁、重量级锁、可重入锁等等概念其实可以用下面一句话来概括这些锁即 这些锁的概念属于不同维度分类下的特称具体分类如下图片所示2.1 获取方式-公平性公平锁、非公平锁公平锁FIFO (First In First Out先进先出也可以理解为先到先得)在程序中线程调用 lock() 上锁若锁空闲立即获取锁并执行后续代码若获取失败则线程阻塞进入等待队列后续代码暂不执行待其它线程将锁释放后队列中按顺序最前面的即排队时间最久的线程优先获取锁重复此操作synchronized非公平锁线程争抢获取ReentrantLock默认非公平可以设置为公平类型优点缺点公平锁避免线程饥饿先到先得策略性能较低上下文切换多非公平锁性能高减少线程切换可能造成线程饥饿争抢锁可能多次争抢不到锁2.2 实现机制-JVM层面偏向锁、自旋锁、轻量级锁、重量级锁偏向锁 → 轻量级锁 → 重量级锁是JDK1.6之后 synchronized 锁升级的核心机制属于JVM内层优化ReentrantLock 不适用这个体系锁类型核心思想最佳适用场景优点缺点偏向锁 (Biased Locking)所默认偏向第一个线程单线程重复获取同一锁单线程场景下获取锁成本几乎为0若有竞争则需要撤销偏向锁轻量级锁 (Lightweight Locking)CAS 自旋不阻塞线程多线程交替执行竞争不激烈避免了线程阻塞/唤醒的内核开销自旋会导致CPU一直空转消耗重量级锁 (Heavyweight Locking)Operating System(操作系统) OS互斥量多线程激烈竞争不会浪费CPU上下文切换开销大自旋锁 (Spin Lock)一种技术不是一个锁是轻量级锁的底层实现锁升级过程为 无所状态————偏向锁(只有一个线程)————轻量级锁(存在少量线程竞争)————重量级锁(大量线程争抢超过了自旋阈值)偏向锁时所默认偏向第一个获取的他的线程消除同步操作锁的对象头会记录当前线程ID轻量级锁若线程A占有锁线程B尝试获取锁会进行自旋尝试CAS替换锁对象头的线程ID若自旋多次失败超过了阈值则膨胀为重量级锁重量级锁依赖操作系统的互斥量mutexpthread_mutex_lock(mutex)加锁互斥指同一时间只允许一个线程访问量指一个内核数据结构记录锁的状态和等待队列2.3 设计思想乐观锁、悲观锁可重入锁分段锁、乐观锁通常指对于更新成功数据保持乐观认为不会发生冲突所以不会直接加锁(这里指的是重量级锁)而是更新数据时检查数据值或数据版本号public static void main(String[] args) { // 模拟共享资源余额100元这里以整数 Integer 为例 AtomicInteger balance new AtomicInteger(100); System.out.println(初始余额: balance.get()); // 尝试存 50 元期望从 100 变成 150 boolean success balance.compareAndSet(100, 150); if (success) { System.out.println(存钱成功当前余额: balance.get()); } else { System.out.println(存钱失败余额已被修改); } // 再次尝试这次期望值不对 boolean fail balance.compareAndSet(100, 200); System.out.println(第二次尝试结果: fail); System.out.println(当前余额: balance.get()); }悲观锁通常指对于更新成功数据保持悲观所以一定要加锁(重量级锁)保持我更新数据时被其他线程影响// 悲观锁假设会发生冲突直接加锁 synchronized (lock) { // 修改共享资源 }可重入锁同一个线程可以重复获取同一把锁// 同一个线程可以重复获取同一把锁 public class ReentrantDemo { public synchronized void method1() { System.out.println(method1); method2(); // 可以再次获取锁 } public synchronized void method2() { System.out.println(method2); } // ReentrantLock 也是可重入的 ReentrantLock lock new ReentrantLock(); public void test() { lock.lock(); lock.lock(); // 可以多次lock try { // 需要同样次数的unlock } finally { lock.unlock(); lock.unlock(); } } }分段锁2.4
http://www.zskr.cn/news/1317876.html

相关文章:

  • 2026.5.17 java2
  • 告别手工制作!用EZCard批量生成桌游卡牌,效率提升800%
  • Gaffer性能优化秘籍:10倍提升图数据库查询效率的完整指南
  • Koltin 语言与Java语言有哪些差异?
  • 长期使用 Taotoken Token Plan 套餐的成本节约感受
  • sandmap实战案例:从主机发现到漏洞扫描的完整工作流程
  • 告别命令行恐惧!用Sourcetree可视化搞定Git日常:克隆、提交、合并分支一条龙
  • Haneke与AFNetworking集成实战:构建强大的iOS图片加载系统
  • 全新UI 阅后即焚V2正式版系统源码_全开源_安全加密传输
  • 【免费下载】 AC696N SDK 使用指南
  • Jetson Orin NX上Ubuntu 20.04中文输入法失踪?手把手教你用ibus-pinyin搞定它
  • 逆向闲鱼App抓包签名:从Frida Hook到寻找Sign算法的完整思路解析
  • Gridforms打印样式优化:从屏幕到纸张的无缝转换技巧
  • 巨有科技:5・19 中国旅游日,数字文旅如何让市集 “活” 起来
  • 百度网盘下载地址解析工具:告别限速的终极指南
  • KCF算法在无人机视觉跟踪中的应用实战:如何用Python实现稳定跟随与抗遮挡
  • 3步轻松重置JetBrains IDE试用期:ide-eval-resetter终极指南
  • 如何高效使用开源股票数据接口:专业量化工具实战指南
  • CLI-Anything未来展望:即将支持的10大新功能与软件集成
  • NoFences:彻底告别Windows桌面混乱,打造高效工作空间的免费开源神器
  • Nigate:让Mac用户告别NTFS读写烦恼的终极免费方案
  • Windows完美显示苹果HEIC照片:3步快速解决跨平台预览难题
  • Windows下根据Mysql原始ibd文件还原数据库
  • 3分钟搞定B站视频下载:免费解锁4K大会员高清视频的完整教程
  • Bilibili-Evolved:打造无网络依赖的哔哩哔哩增强体验技术解析
  • 淄博 GEO 优化公司排名 2026:制造业 AI 获客服务商综合实力榜 - 资讯焦点
  • 3步解锁FModel:从游戏资源提取到创意实现的完整指南
  • 从ChatGPT到文心一言:大模型水印技术如何影响我们日常的AI工具使用?
  • 查重率居高不下?绝密降重套路赶紧码住
  • 抖音批量下载终极指南:douyin-downloader高效获取无水印内容实战