常见线程安全问题
之前的几章中,我们自底向上的地了解了并发编程的一些基本原理与限制,学习了Java 的 Happens-Before 机制,能用一些基本的原语来指定线程间的相对运行顺序。
通常以上层开发者的视角,能意识到有并发问题存在,并适时地使用 synchronized
加锁或用 java.util.concurrency
(简称 JUC) 里的一些并发集合类(如ConcurrencyHashMap
、ArrayBlockingQueue
等)就可以了,这些工具已经对常用的并发需求提供了很好的抽象,它们的原子性、顺序性和有序性通常符合我们的直觉,不需要额外关心。
不过如果你想要了解这些抽象类的工作原理,或者有特殊需求需要做一些“骚操作”,那么就需要充分理解底层细节和影响。
本章中会罗列一些常见线程安全问题,一方面希望前面的理论知识能有用武之地,帮助我们理解一些极端条件下出现问题的原因;另一方面希望能识别一些常见的出现线程安全问题的使用模式。
参考
- https://hacks.mozilla.org/2019/02/fearless-security-thread-safety/