云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

25|锁家族的裂变:如何打造一个锁程序?

你好,我是康杨。
在多线程编程中,锁是一个非常重要的概念。了解不同类型的锁以及它们的特性和使用场合,能够帮助我们编写出高并发、高效率的程序。今天我们来聊聊 Java 中的各种锁,深入剖析这些锁的工作原理和应用场景,并了解如何使用 AQS(AbstractQueuedSynchronizer)构造自定义锁。

锁的分类

Java 锁可以根据不同的维度进行分类,这里我列举了几种常见的分类方式。

乐观锁和悲观锁

乐观锁和悲观锁是并发控制领域的两种主要策略,它们在处理多线程对共享资源的访问时采用不同的方法。
乐观锁,顾名思义,是一种比较乐观的策略。它假设数据在同一时间被多个线程修改的概率比较小,因此不会在读取操作时对数据加锁。这种锁策略适用于读取操作远多于写入操作的场景。在 Java 中,原子操作类(如 AtomicInteger、AtomicLong 等)就是乐观锁的典型应用。乐观锁的核心思想是,在读取数据时,不考虑数据可能被其他线程修改的情况,只在数据写入时通过版本号机制进行校验。如果发现数据已经被其他线程修改,那么就放弃此次写入,重新读取数据并尝试再次写入。
悲观锁,则是一种比较悲观的策略。它假设数据在同一时间被多个线程访问的概率较大,因此会始终对数据进行加锁保护。这种锁策略适用于数据竞争比较激烈的场景。在 Java 中,同步关键字 Synchronized 或 ReentrantLock 就是典型的悲观锁。悲观锁的核心思想是,在任何时候,只允许一个线程对数据进行操作,其他线程必须等待,直到获得锁。这样就能确保数据在读取和写入过程中的安全性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Java中各种锁的分类和特性,包括乐观锁和悲观锁的概念及应用、独占锁和共享锁的区别、公平锁和非公平锁的特点及应用场景。此外,还深入剖析了锁的基本概念和实现方式,包括锁的状态、获取和释放,以及锁的升级。通过代码示例展示了使用Synchronized关键字实现悲观锁的例子。文章通过清晰的分类和丰富的示例,帮助读者快速了解Java中各种锁的特点和应用场景,对并发编程有很好的指导作用。文章还介绍了使用AQS构建自定义锁的方法,以及在多线程编程中选择合适的锁策略的重要性。文章以思考题的形式引导读者思考乐观锁和悲观锁的区别及主要应用场景,以及如何打造一个自定义的锁程序。整体而言,本文内容丰富,涵盖了Java中锁的各个方面,对于想要深入了解并发编程的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 进德修业
    独占锁和共享锁代码,怎么看两个除了方法名不一样其他都一样,是不是初始化的时候写错了呀
    2023-10-25归属地:上海
    5
    3
  • peter
    请教老师两个问题: Q1:共享锁需要等待的话还怎么共享? 文中这句话“当一个线程想要获取共享锁,但如果当前已经有其他线程持有共享锁,那么这个线程必须等待”,根据这句话,也只能是一个线程能够获取锁,这怎么共享? Q2:共享锁、独占锁的例子,有什么区别? Lock exclusiveLock = new ReentrantLock(); Lock sharedLock = new ReentrantLock(); 两个定义相同,使用的代码也相同,怎么区分共享与独占?
    2023-10-25归属地:北京
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部