只能保证一个共享变量的原子操作:当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。
使用锁来保证原子操作还是以上面的列子为列,普通的计数器我们只需要在计数方法上加锁就行了:
public synchronized void add(int delta){ this.count = count+delta; }执行结果如下:
normalCounter:1000000 safeCounter:1000000两个计数器都能拿到正确的结果
CPU是怎么实现原子操作的