• 无锁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

  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/lizhiyan-world/p/6884971.html
Copyright © 2020-2023  润新知