假设现在有线程A和线程B,还有全局变量i,寄存器X
1、线程对全局变量的访问时分三步走的 :
(1)、取全局变量i到某个寄存器X
(2)、对寄存器进行操作,即操作i的值
(3)、操作完之后将寄存器X的值存会i
2、多线程实际上是由时间片选来轮换进行的。当线程A执行到某个地方还没结束的时候,可能就会轮换到线程B来执行。
3、总和上述两点,当线程A访问变量i的时候,可能只到了第(2)小步,就轮换到线程B了。
举个例子:
线程A 线程B
i = 1 --i
++ i
执行过程顺序如下:
最终的结果可能是0或者1或者2。
小结:如果多线程里面的共享变量(整型变量、链表等等)是需要都进行运算,增减的,一定要加线程锁,保证执行顺序。加了锁,保证一个线程的该部分访问完再访问其他线程的,这就叫原子性。需要靠加锁来保证原子性操作。
那么,如果变量的运算、增减只在一个线程里面,其他线程只是取这些值做判断而且是循环性质的判断,那可以不用加。否则,哪怕只是做判断但没有循环地去判断,一定得加锁。