竞态条件
1.定义
由于不恰当的执行时序而出现不正确的结果.
最常见的类型是 "先检查后执行";
比如两个线程同时操作一个变量.我们定义一个 变量 int i = 0; 给 i 增加1;
增加1的过程有三个操作"读取-修改-写入",结果状态依赖于之前的状态.
但是在多线程情况下,这个状态依赖会被别的线程所修改,也就是说一个线程读取了 i = 0; 然后修改为 i = i + 1; 修改过程依赖的是之前读取 i = 0 的结果, 但是如果 i = 0 被别的线程所修改,
我们就可以说这就是出现了竞态条件,因为 : 我们这个操作基于了可能失效的观察结果来做出判断或执行某个计算,这也是竞态条件的本质, 多线程条件下状态依赖会被修改.
2.解决:
在明白了问题的发生后,解决就比较容易,"读取-修改-写入"让这一组操作变为原子操作就可以,要么都执行,要么都不执行,在没有执行完的时候加锁,让别的线程在没有获取锁的情况下阻塞,也就达到了线程安全的目的.
和事务类似,都是要么都执行,要么都不执行,使用了相同的思想.典型应用就是 synchronized 关键字 以及 通过 Atomic变量来控制状态来创建线程安全的类,因为线程安全的类在多线程条件下一定是线程安全的.