zoukankan      html  css  js  c++  java
  • 原子类

    AtomicInteger

    getAndSet方法   修改值并返回旧值

    public final int getAndSet(int newValue) {
            return unsafe.getAndSetInt(this, valueOffset, newValue);   //调用unsafe的方法
        }
    public final int getAndSetInt(Object var1, long var2, int var4) { 
            int var5;
            do { 
                var5 = this.getIntVolatile(var1, var2);  //通过对象及value的偏移地址来获得value的值
            } while(!this.compareAndSwapInt(var1, var2, var5, var4)); // var1 对象本身 var2 偏移地址 var 5 旧值 var4 新值 这样就可以原子的修改value的值
    
            return var5;
        }

    在类加载时就会执行静态代码块里的代码,valueOffset就是value在内存中的地址,也就是偏移地址

    static {
            try {
                valueOffset = unsafe.objectFieldOffset
                    (AtomicInteger.class.getDeclaredField("value"));
            } catch (Exception ex) { throw new Error(ex); }
        }

    compareAndSet方法

     public final boolean compareAndSet(int expect, int update) {
            return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
        }
  • 相关阅读:
    UVA 10608 Friends
    UVA 10806 Dijkstra, Dijkstra.
    HDU 3715 Go Deeper
    poj1315
    poj1383
    poj1650
    poj1265
    poj1523
    RedHat9.0虚拟机安装
    注册DirectShow filter时应该注意中文路径
  • 原文地址:https://www.cnblogs.com/lzh66/p/13230656.html