原因
这里的increase方法执行的操作是i++ 即 i = i + ;
针对i = i + 在多线程中的运算本身需要改变i的值
如果在i已从内存中取到最新值但未与进行运算此时其他线程已数次将运算结果赋值给i
则当前线程结束时之前的数次运算结果都将被覆盖
即执行次increase 可能结果是 <
一般来说这种情况需要较高的压力与并发情况下才会出现
如何避免这种情况?
解决以上问题的方法
一种是操作时加上同步
这种方法无疑将大大降低程序性能且违背了volatile的初衷
第二种方式是使用硬件原语(CAS)实现非阻塞算法
从CPU原语上支持变量级别的低开销同步
CPU原语比较并交换(CompareAndSet)实现非阻塞算法
什么是CAS?
cas是现代CPU提供给并发程序使用的原语操作不同的CPU有不同的使用规范
在 Intel 处理器中比较并交换通过指令的 cmpxchg 系列实现
PowerPC 处理器有一对名为加载并保留和条件存储的指令它们实现相同的目地
MIPS 与 PowerPC 处理器相似除了第一个指令称为加载链接
CAS 操作包含三个操作数 内存位置(V)预期原值(A)和新值(B)
什么是非阻塞算法?
一个线程的失败或挂起不应该影响其他线程的失败或挂起这类算法称之为非阻塞(nonblocking)算法
对比阻塞算法
如果有一类并发操作其中一个线程优先得到对象监视器的锁当其他线程到达同步边界时就会被阻塞
直到前一个线程释放掉锁后才可以继续竞争对象锁(当然这里的竞争也可是公平的按先来后到的次序)
[] [] [] []