汇编指令中:
在32位系统中,且i没有跨页,那么i++是原子的。其指令格式如下:
movl x, %eax
addl $1, %eax
movl %eax, x
在64位系统中,i++无论如何也不是原子操作。其指令代码如下:
movl x, %eax
movl x+4, %edx
addl $1, %eax
adcl $0, %edx
movl %eax, x
movl %edx, x+4
但是,在高级程序语言中,如java与C++等,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。
之前我以为只要加上volatile修饰符就可以使i++操作编程原子性,但事实不是这样的。
加上volatile只是在编译器优化时,提示每次都从内存中读取i的值。可是当两个线程进行操作时,仍然会出现重复写会的操作。(这句是我的猜测,因为我写的多线程程序会出现两次i++后结果一样的情况)
因此,最安全的方法是将i++放入加锁的方法块中。这样就可以保证安全的访问量。例(对于java): synchronized method(){i++;}
以上是一些心得,不正确的地方敬请指正,希望对大家有帮助。