原子变量 java.util.concurrent.atomic jdk 1.7
程序员文章站
2022-07-12 18:38:31
...
在java并发包的一个子包中,提供了针对于基础类型的原子类型,熟悉并发的会知道,i++并不是一个原子操作,long longValue = 100l;也不是一个原子操作;
那么java.util.concurrent.atomic包中是如何实现对基础类型数据的原子操作的呢?
以AtomicLong类为例:
private volatile long value;
AtomicLong类有个成员变量value,声明为volatile的;也就是各个线程的共享变量,
以getAndAdd方法来说明增加值是如何实现原子操作的:
public final long getAndAdd(long delta) { while (true) { long current = get();//获取线程中最新的value long next = current + delta;//获取修改后的期望值 if (compareAndSet(current, next))//判断value值是否被修改,如果被修改在while循环中循环改过程,如果未被修改,返回修改后的值 return current; } } public final long getAndAdd(long delta) { while (true) { long current = get(); long next = current + delta; if (compareAndSet(current, next)) return current; } }
上面这个方法的实现,就是一个CAS(lock-free)算法的一个实现,该算法在网上有很多详细的解释,大家可以详细的看一下!