https://blog.csdn.net/qq_32222165/article/details/106571793

但是即使是用volatile修饰了sales,依然不能保证线程的安全。因为sales++这个操作不是原子性,在底层是需要三个动作才能完成的,即cpu读取内存中的值——cpu将值+1——cpu将值写回内存。而由于是多线程,假设X线程执行的时候,在其中任何一步中,cpu资源被抢夺发生线程切换,切换到Y线程,此时由于X线程没有执行完成,所以Y线程去内存中读取到sales的值是0,然后Y线程执行,将sales++,然后写回。假设这时候X线程又被执行了,此时,由于之前已经读取过sales的值了,不会再从内存中读取了,而是直接通过线程的上下文切换机制,获取到X线程没有执行完毕时候的sales的值,然后执行完毕,sales变为1,然后写回主内存。此时sales的结果是1,依然有线程安全问题。所以需要用java的原子操作类。

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_32222165/article/details/106571793