zoukankan      html  css  js  c++  java
  • 无锁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

  • 相关阅读:
    C#处理Json文件
    asp.net ToString()格式汇总
    通过一段代码说明C#中rel与out的使用区别
    EnterpriseLibrary4 自己封装程序集实现log打印
    Logger日志打印普通方法
    后台代码对iBatis配置文件中具体的sql语句的调用实现(被封装的增删改查)
    Cryptography加密和解密
    GETorPOST方式保存和获取图片信息
    Response响应请求操作
    图片的读取和保存操作
  • 原文地址:https://www.cnblogs.com/lizhiyan-world/p/6884971.html
Copyright © 2011-2022 走看看