在本讲中,我们讲解什么是竞态条件:当多个线程同时访问共享数据,而结果取决于调度顺序。以自增
counter
++ 为例,展示为什么该操作不是原子的,以及增量是如何丢失的。我们分析一个银行账户的实战案例、在生产环境中的后果以及防护手段:
synchronized、来自
java.util.concurrent.atomic 的原子类型(例如
AtomicInteger),以及不可变性。最后以“典型错误”一节收尾,解释为什么与
Thread 相关的 bug 很少被测试捕获,以及为何用
Thread.
sleep(
1) 来“治疗”它们是没有意义的。