原子性:AtomicInteger

2018-12-05  本文已影响0人  杨凯飞

//先增加后操作

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());

}

上一篇 下一篇

猜你喜欢

热点阅读