“原子操作(atomic operation)是不需要synchronized”,这是多线程编程的老生常谈了。
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切 [1] 换到另一个线程)。
i++不是原子操作!
其执行要分为3步:
1、读内存到寄存器;
2、在寄存器中自增;
3、写回内存。
举个例子:
现有A,B两个线程,初始i=2;A线程完成1,2步后被切换到B线程,在B线程中执行完这3步,再切换回来,此时A寄存器中的i=3写回内存,故最后i=3,而不是正常的4;所以不是原子操作。