无锁atomicInteger

Posted Programmer★小李

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无锁atomicInteger相关的知识,希望对你有一定的参考价值。

AtomicInteger可以保证硬件上的原子操作

1.主要原理

  CAS操作

在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败,  CAS就是Compare and Swap的意思,比较并操作

AtomicInteger主要是调用了Unsafe类中的  compareAndSwapInt 方法

2.源码:

public final int incrementAndGet() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return next;
        }
    }
public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

 3.使用

 //获取当前的值
 public final int get()
 
 //取当前的值,并设置新的值
 public final int getAndSet(int newValue)
 
 //获取当前的值,并自增
 public final int getAndIncrement() 
 
 //获取当前的值,并自减
 public final int getAndDecrement()
 
 //获取当前的值,并加上预期的值
 public final int getAndAdd(int delta)

 4.不足之处

比较更新的这个值,无法进行判断内存的值是否是被别人更改过之后,再更改回来的,

例子:

线程1 先将data读入0,进行加工,加工之后数据为2

线程2 也读入data0, 进行加工,加工之后数据为1

现场3 也读入data1, 进行加工,加工之后数据为0

若线程1先开启。但是最后结束,那么进行  data预期值与内存中值进行比较的时候,就会有问题,因为内存中的数据data  0 已经不是线程1读取的时候的那个 data0 ,但是这个无法进行判断

 

 

这个不足之处的解决,可以使用:AtomicStampedReference

 

以上是关于无锁atomicInteger的主要内容,如果未能解决你的问题,请参考以下文章

哪些 AtomicInteger 方法是 test-and-set、fetch-and-add 和 compare-and-swap(就无锁算法而言)?

4.4.4 无锁的对象引用:AtomicReference和AtomicStampedReference

JUC9. AtomicInteger源码

并发线程安全的 AtomicInteger

actomic cas无锁操作。

并发之无锁技术归纳