volatile 保证什么,又不保证什么
volatile 解决的是多线程下的可见性与有序性,不保证复合操作的原子性。在 JMM 里它对应 happens-before 规则;在 HotSpot 里它落实为 acquire/release 语义的字段访问与 StoreLoad 屏障——不是锁的轻量替代品。 1 问题背景: …
继续阅读标签
共 6 篇
volatile 解决的是多线程下的可见性与有序性,不保证复合操作的原子性。在 JMM 里它对应 happens-before 规则;在 HotSpot 里它落实为 acquire/release 语义的字段访问与 StoreLoad 屏障——不是锁的轻量替代品。 1 问题背景: …
继续阅读1 问题背景:为什么需要线程本地变量 在 Web 服务、链路追踪、日志框架等场景中,经常需要在一次请求的调用链上传递「隐式参数」:traceId、用户 ID、事务上下文、Locale 等。如果把这些参数逐层作为方法参数传递,中间层往往只是透传,既不灵活,也会让方法签名膨胀。 …
继续阅读1. 引言:为什么 synchronized 仍然重要 在 Java 并发编程中,ReentrantLock、StampedLock、ConcurrentHashMap 等工具层出不穷,但 synchronized 从未退场。它是 JVM 内置监视器锁(Monitor) 的语法糖 …
继续阅读AQS 是 Java 并发包的基础抽象框架,它将多线程同步的通用逻辑(如线程排队、阻塞、唤醒、状态原子性维护)进行了统一封装。基于这一框架,开发者能以极低的代码成本,高效地实现诸如 …
继续阅读线程池这块的源码,很多人看过一遍就忘,或者只记住了几个参数的含义,对内部的运行机制其实并不清楚。今天就从源码层面,把运行机制、Worker 的设计、锁的选择、以及异常处理,认真过一遍。 任务进来之后,发生了什么 先把整体流程过一下。 一个 Task 提交进来,线程池先看当前 …
继续阅读接口和抽象类不是语法层面的区别,而是设计思想的不同。语法差异只是表象,真正决定选型的是它们各自解决的工程问题和承载的设计原则。 1 设计层面的根本分歧 抽象类和接口在设计上回答的是两个不同的问题: 抽象类回答的是"哪些逻辑是所有子类共有的,哪些细节需要留给子类 …
继续阅读