CAS的核心操作是比较并交换,具体是假设当前内存位置V的值为A,如果给定的值确实为A那么将新值B设置到内存位置V上,最后总是返回内存位置原有的值。

这是一个典型的读-改-写的操作,并且是原子操作,那可以利用这个特性来构建无锁的线程安全操作。具体的步骤与CAS的核心操作是类似的,只是当CAS操作失败的时候会一直检查失败条件直至成功(注意:这里如果长时间不成功则会占用大量的CPU资源,一种情况就是在“谈谈原子变量与锁的性能比较”中提到的大量线程在激烈竞争的时候会导致更多的竞争)。以数值自增为例:

private static class MyAtomicInteger{
        AtomicInteger ai = new AtomicInteger(0);
        
        public int incrementAndGet(){
            while(true){
                int old =  ai.get();
                int newVal = old+1;
                if(ai.compareAndSet(old, newVal)){
                    return newVal;
                }
            }
        }
    }

虽然AtomicInteger自带该方法,但这里为了说明执行原理。

01-11 23:03