IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Lock

共 4 篇相关文章

IT 累计浏览 23,588

一种常见的并发编程场景的处理

这篇讲的是并发编程中一个容易被忽略的典型场景:当一个“守护线程”提供共享资源,多个业务线程频繁读写,而主线程仅偶尔需要介入(比如统计数据、做快照)时,如何设计才能兼顾性能与数据安全? 文章指出,如果主线程和业务线程使用同一把锁(如 `synchronized`),在绝大多数(99.9%)主线程不介入的时间里,业务线程之间会产生不必要的锁竞争,拖累性能。作者给出的方案是引入 `AtomicBoolean` 和 `AtomicInteger` 两个原子变量(volatile 变量的实现)来协调状态:一个标志主线程是否正在独占操作,另一个统计当前正在写入的业务线程数。这样,业务线程只需在主线程介入时等待,而彼此之间几乎无需竞争锁,从而在大多数时间里实现近乎无锁的并发写入。 文章以 `ConcurrentHashMap` 为例给出了核心代码,并坦承在 Java 中这点性能差异或许可以忽略,且方案本身有一定复杂度。但作者认为,这种在“性能和数据保护之间寻求最大平衡”的设计思路,其实践意义是利大于弊的。

IT 累计浏览 4,059

锁是怎么实现的?

这篇讲的是锁在计算机底层的基本实现原理,作者从最基本的机制出发,梳理了实现锁的几种核心方式。 文章首先排除了应用层常见的各类复杂锁,聚焦于最底层的实现。它可能从原子操作说起,比如利用CPU的原子指令来保证单个操作的不可分割性,这是构建一切锁的基石。接着,会探讨更复杂的实现:比如自旋锁如何让线程在“忙等”中循环尝试获取锁,适用于极短临界区;而互斥锁或信号量则可能涉及内核态与用户态的切换,通过让线程挂起和唤醒来避免CPU空转,适用于可能耗时较长的场景。作者或许还会简要提及读写锁如何分离读写权限以优化并发性能。 这种从原理根源讲起的方式,帮助读者跳出了对“锁”这个抽象概念的模糊认知,理解了不同锁策略在性能、开销和适用场景上的根本权衡,为选择和设计正确的并发方案打下了基础。

IT 累计浏览 2,753

mysql技术内幕-innodb存储引擎读书笔记(下)

这篇是《MySQL技术内幕:InnoDB存储引擎》的读书笔记下篇,作者聚焦于全书最复杂也最关键的一章——锁。InnoDB的锁机制设计得非常精密,但也因此容易让人困惑,这篇文章就像一位向导,带读者梳理清楚这个“交通规则”复杂的系统。 作者从InnoDB为什么需要如此复杂的行级锁讲起,依次拆解了共享锁与排他锁、记录锁、间隙锁(Gap Lock)以及能同时锁住记录和间隙的Next-Key Lock。文章特别对比了不同锁类型在解决幻读问题上的差异,并解释了意向锁(Intention Lock)如何快速表征表中已有行锁存在,从而避免逐行检查的开销。 对于实际开发中常遇到的“死锁”问题,文章也从锁等待和锁冲突的角度给出了分析思路。通过这些具体的锁形态和实现逻辑的剖析,读者能理解为什么在高并发更新同一行数据时,InnoDB能保证数据一致性,以及为什么某些查询范围会导致意想不到的锁等待。这对于优化事务设计和排查锁性能瓶颈有直接的帮助。

IT 累计浏览 3,430

library cache pin和lock的区别

这篇讲的是Oracle数据库中library cache pin与library cache lock这两个常被混淆的概念。作者从一个经典的面试问题出发,坦言自己曾被难住,并在与同事的深入讨论和查阅官方文档后,终于理清了二者的本质区别。 文章的核心在于细致对比。简单说,lock保护的是对象在共享池中的存在性(如一个游标的打开状态),而pin则保护的是对象本身的内容(如SQL语句的执行计划)不被修改或刷出。关键差异体现在阻塞场景上:lock通常阻塞DDL或依赖管理操作,而pin则直接阻塞那些需要执行SQL的会话。它们就像数据库门卫和内容保镖的不同分工。 作者没有停留在概念,还结合了V$SESSION_WAIT视图的观测,剖析了它们在争用时的不同等待事件。这种从实际讨论到理论梳理,再回归实践验证的路径,为理解Oracle共享池的底层保护机制提供了清晰的逻辑线索。