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自带该方法,但这里为了说明执行原理。