Volatile为什么不能做i++问题的个人理解
volatile不保证原子性,也就是说在对volatile变量读写操作的时候,容易出现问题。
我的理解如下:
假设有10个线程,每个线程对i进行++1,1000次操作
在A线程将主内存变量int i=3读取回工作内存的时候,这里是原子性的,但是当A线程调用CPU对 i的值+1的运算间隙,也许是1ns,这个时候B线程已经等不及了,来抢资源了,B并没有等A将i的操作做完再读取i的值,这个时候B线程获取到了i的值,也是3,(如果是单线程,那么应该是A线程i+1返回给主内存4,B去主内存拿4,再+1,这样循环累加)
,B就是对3进行+1了,原本B是要对A修改之后的i(也就是4)进行++操作,但是B是和A一样拿到了3,这样就丢失了一次i++。造成总的累加的值,到不了10000,。
解决办法就是加synchronized,保证只有一个线程进来操作。
通常volatile
用来保存某个状态的boolean值。
Volatile为什么不能做i++问题的个人理解
于 2022-03-13 14:48:04 首次发布
本文探讨了volatile关键字在多线程环境下无法保证原子性的问题,通过举例说明了在并发操作中,volatile变量如i进行自增时可能出现的数据不一致情况。由于volatile不保证操作的顺序和可见性,可能导致线程间的操作交错,从而丢失更新。解决方法是使用synchronized来确保互斥访问,以保证并发安全。文章强调volatile更适合用于保存状态型的boolean值,而非参与计算的变量。
摘要由CSDN通过智能技术生成