开篇:不用锁也能线程安全?
想象你在银行柜台,100 个人同时往同一个账户存 1 块钱。如果每个人都要"查余额 -> 加 1 -> 写回去",中间不锁柜台,最终余额几乎不可能是 100。这就是经典的并发写问题。
加锁当然能解决,但锁意味着排队,排队意味着慢。有没有不排队的方案?JDK 给了我们两条路:
- 原子类:基于 CAS 硬件指令,在不加锁的前提下完成"读-改-写"三步的原子操作。
- ThreadLocal:干脆不共享,每个线程自己玩自己的副本,连冲突都不存在。
大约 13 分钟
想象你在银行柜台,100 个人同时往同一个账户存 1 块钱。如果每个人都要"查余额 -> 加 1 -> 写回去",中间不锁柜台,最终余额几乎不可能是 100。这就是经典的并发写问题。
加锁当然能解决,但锁意味着排队,排队意味着慢。有没有不排队的方案?JDK 给了我们两条路: