- 假设i从0开始,那么两个线程分别i++一百次后i的值有可能是:2-200。
- 首先我们要知道java中的i++不是原子操作,因为这个操作分为三个步骤:
- 将内存中i的值读到寄存器
- 在寄存器中自增
- 将自增后的值写回内存
- 这种情况比较理想,假如两个线程之间没有发生打断对方i++时候三个步骤中的任何一步,那么i的值就会顺理成章自增200次,最后得到200。
- 这种情况比较极端:
- 线程一将i=0的值取出到寄存器中,寄存器中的值+1变成1,还未写回内存,被线程二打断,此时内存中i=0,进程一寄存器的值为1
- 线程二完成99次自增操作,此时内存中i=99,被线程一打断,线程一将寄存器中的1写回内存,此时内存中的i=99被覆盖成i=1,然后线程一又被线程二打断
- 此时线程二只剩最后一次自增操作,它首先将此时内存中i=1的值读到寄存器中,寄存器中的值加一变成2,被线程一打断
- 此时内存中i=1,线程一完成剩下的全部自增操作,此时i=100,轮到线程二
- 线程二将寄存器中的2写回内存,最后内存中i=2



