//先增加后操作
AtomicInteger.incrementAndGet();
//先操作后增加
AtomicInteger.getAndIncrement();
源码
1 2在unsafe类中提供了getAndAddInt的实现,在do while中做主题实现。
在这个方法中,第一个参数为AtomicInteger对象,第二个是当前的值,第三个为1。
var5 是调用底层的方法,得到底层当前的值。如果没有其他线程来处理的话,他应该返回的是var2的值。
3所以在执行 this.compareAndSwapInt(var1, var2, var5, var5 + var4)这个方法的时候var2是等于var5的
这个方法的目的是,如果当前的值(var2)和从底层取出来的值(var5)相同,那么就将取出来的值(var5)加1。否则重新去取底层的值(var5)和当前的值(var2 var2是重新从var1这个对象里面取)来进行循环操作。到达期望值与实现值相同
初次之外还有AtomicLong等等,(在JDK1.8中引入了LongAdder)
因为这些都在循环里操作的,如果竞争强烈会应该性能。
对于普通类型的long 和double变量,JVM允许将64位的读操作或写操作拆成2个32位的操作。
AtomicReferencecount
private static AtomicReferencecount=new AtomicReference<>(0);
public static void main(String[] args) {
count.compareAndSet(0,2);
count.compareAndSet(0,3);
count.compareAndSet(2,9);
count.compareAndSet(3,4);
count.compareAndSet(3,5);
log.info("count:{}",count.get());
}
网友评论