一.由于线程之间是"抢占式"执行的过程,这些线程谁先执行谁后执行,不能确定,完全取决于cpu的调度,所以这也是线程不安全的罪魁祸首.
二.多个线程同时修改统一个资源
我们哪count++这个例子解释一下,count++这个操作就是针对内存中的count变量进行修改操作,修改操作一般都是cup来完成的,分为三个步骤:
1.先把内存中的数据读取到cpu的寄存器中.
2.针对寄存器中的内容,通过add这样的指令+1操作,操作的结果仍然保存在寄存器中.
3.把寄存器中的数据,写回到内存中去.
绘图描述以下可能发生线程不安全的原因:
可以看到结果并不是正确的.
三.修改操作不是原子性的.
如果count++的三个操作被打包成一个整体,禁止相互穿插执行,也就保证线程安全.
四.内存可见性
其实和刚才i++,的过程一样,两个线程同时操作同一块内存,比如,一个读,一个写,写操作的线程进行了修改,读线程读取到也可能是修改之前的结果,也可能是修改之后的结果,不确定因素太多,也会有线程安全的问题存在.
五.指令重排序
为了让程序跑的更快,编译器调整了程序的执行顺序(再不改变逻辑的情况下).所以在多线程情况下也会有线程安全的问题存在.
线程安全问题
最新推荐文章于 2024-07-20 13:04:23 发布