谁不安全?
https://blog.csdn.net/huike_/article/details/78368852
首先i++是不安全的,++i是安全的,这一点要从汇编角度去考虑:
i++在函数压栈过程前:
1,先取内存数据段i的值,存入一个临时量中;
2,然后进行自加,再写入内存数据段的i中;
3,等待所有参数运算完成后,最后压栈时,将保存的临时量的值进行压栈。
++i在函数压栈过程前:
1,直接取内存数据段的i值,进行自加,再写入内存数据段的i中;
2,等待所有参数运算完成后,最后压栈时,直接取内存数据段的i值进行压栈。
为什么不安全?-- 线程不安全
https://www.jianshu.com/p/4f0d6e276751
显而易见,我们只有一个count共享变量,那么不安全的原因便是i++是不是原子操作的问题了。
i++有以下步骤:
1、内存到寄存器
2、寄存器自增
3、写回内存
任何一部都可能中断分离开,所以不是原子操作,从而发生了线程安全问题。比如23顺序颠倒了则这次自增将会不生效。
为什么不安全?-- 并发不安全
i++执行了多部操作,从变量i中读取读取i的值->值+1 ->将+1后的值写回i中,这样在多线程的时候执行情况就类似如下了
Thread1 Thread2
r1 = i; r3 = i