对于i++的操作,分为三步:
- load,读取主内存值
- i = i + 1,执行+1运算
- store,刷新回主内存
(1)线程A完成1、2两步,还没刷回主内存
(2)线程B完成1、2、3三步,写回主内存,通过总线嗅探让线程A中缓存失效(删除)
(3)线程A由于已经完成了第2步运算,即使工作内存中的值已经失效也不会重新读取,而是直接写入工作内存,在写回到主内存
解决方案:
(1)synchronized、lock加锁
(2)使用AtomicInteger,原子类CAS操作
对于i++的操作,分为三步:
(1)线程A完成1、2两步,还没刷回主内存
(2)线程B完成1、2、3三步,写回主内存,通过总线嗅探让线程A中缓存失效(删除)
(3)线程A由于已经完成了第2步运算,即使工作内存中的值已经失效也不会重新读取,而是直接写入工作内存,在写回到主内存
解决方案:
(1)synchronized、lock加锁
(2)使用AtomicInteger,原子类CAS操作