知识卡片

无锁也有边界

普通读书笔记卡 · 1516

内容

无锁编程避免了线程挂起和恢复的开销,但不等于没有成本。CAS 有三条弊端:一是 [[ABA要看历史]] 的语义问题;二是只能保证单个共享变量的原子性,多个变量需合并成一个对象用 AtomicReference 操作;三是自旋长时间不成功会持续消耗 CPU。规避思路:像 [[LongAdder分散热点]] 那样分散热点,或用队列排队降低并发度(AQS 正是这么做)。选 CAS 前应先判断冲突概率。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第3章《CAS原理与JUC原子类》3.6.1节《CAS操作的弊端和规避措施》(源文件:_epub-src/OEBPS/Text/chapter119.xhtml) - 结论依据:原文列出CAS的三点弊端(ABA问题、只能保证单个共享变量原子性、自旋开销问题),并给出两类规避措施(分散操作热点如LongAdder、用队列削峰如AQS),因此可以推出无锁编程仍有代价、需要按场景权衡的结论。 - 原始内容:CAS操作的弊端主要有以下三点:1.ABA问题……2.只能保证一个共享变量之间的原子性操作……3.开销问题:自旋CAS如果长时间不成功(不成功就一直循环执行,直到成功),就会给CPU带来非常大的执行开销。