线程引用isRunning 变量的时候,会copy一份到独立内存空间当中,所以线程不会停止,加上volatile,改变的值就会进入独立内存空间。也就是说volatile的作用只是让变量在多个线程中的可见,不具备原子性。
而atomicInteger具备原子性,所以在该例子里可以得到最终结果10000,但是atomicInteger只能保证一个方法的原子性,若里面出现多个则不能保证,只能用synchrnized来保证原子性。下面举个例子来证明:
所以要保证例子是10的倍数 需要在方法上加上synchrnized来保证原子性。