3. 线程安全
线程安全:某个代码,不管它是单个线程执行,还是多个线程执行,都不会产生bug,这个情况就成为“线程安全”。
线程不安全:某个代码,它单个线程执行,不会产生bug,但是多个线程执行,就会产生bug,这个情况就成为 “线程不安全”,或者 “存在线程安全问题”。
举个线程不安全例子,我们计算一个变量的自增次数,它循环了100000次,用两个线程去计算,各自计算循环50000次的次数。
3.1 线程不安全样例
根本原因:线程的随机调度,抢占式执行
代码结构:不同线程修改同一数据
直接原因:多线程操作不是原子的
由于线程的随机调度,抢占式执行(不可避免),代码结构会促进该原因加剧不良后果;
3.2 线程不安全问题解决方法
3.2.1 t1 循环里加sleep
3.3.2 给flag变量加volatile修饰
3.3 线程不安全的原因
3.4 针对上述原因给出的解决方案
针对原因1:
我们无法给出解决方案,因为操作系统内部已经实现了“抢占式执行”,我们干预不了
针对原因2:
分情况,有的时候,代码结构可以调整,有的时候调整不了。
针对原因3:
把要修改的变量这操作,通过特殊手段,把这操作在系统里的多个指令打包成一个“整体”。例如加锁操作,而加锁的操作(下一篇详细讲解),就是把多个指令打包成一个原子的操作。
针对原因4:
可以对代码进行调整,避免内存可见性的问题;也可以使用volatile进行修饰,强制把代码优化关了,这样数据就更准确了,但执行效率也就变慢了。
针对原因5:
将某些可能会指令重排序的变量,加volatile修饰,强制取消指令重排序的优化。
ps:本次的内容就到这里了,如果感兴趣的话就请一键三连哦!!!