• 【JAVA笔记——道】JAVA原子性解决方案java.util.concurrent.atomic


    java.util.concurrent是jdk提供在多线程下的原子性解决方案,java.util.concurrent下主要是常用数据结构的原子性实现类,java.util.concurrent.atomic是基础数据类型的原子性实现类
    推荐先看:如何对JAVA进行内存操作 sun.misc.Unsafe类

    AtomicBoolean

    顾名思义,该类其实是一个原子布尔类,定义域如下:

        private static final long serialVersionUID = 4654671469794556979L;
        private static final Unsafe unsafe = Unsafe.getUnsafe();
        private static final long valueOffset;
    
        static {
            try {
            //返回定义域在内存中的偏移量
                valueOffset = unsafe.objectFieldOffset(AtomicBoolean.class.getDeclaredField("value"));
            } catch (Exception ex) { throw new Error(ex); }
        }
    
        private volatile int value;

    在该类中,value是对核心数据boolean的存储,unsafe以及valueOffset都是用于实现value操作过程中的原子性。并发性的控制主要通过Unsafe进行操作。

    //正常赋值
    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }
    
    //懒加载,内存操作,不进行store load
    public final void lazySet(boolean newValue) {
        int v = newValue ? 1 : 0;
        unsafe.putOrderedInt(this, valueOffset, v);
    }
    
    //取值后更新
    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));
        return prev;
    }
    //if(expect == update) update();
    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }
    

    “`
    与之相似的还有AtomicInt,AtomicLong等,实现方式没有太大的区别。

    相对与并发控制语句,原子操作实际上进行的是内存级别的乐观锁控制,因此,性能上要比synchronized性能高出300倍以上

  • 相关阅读:
    Android listview addHeaderView 和 addFooterView 详解
    android NDK 生成so 文件流程-ecplice
    PopupWindow+ListView+OnItemClick点击无效
    绘制圆动画--重写view
    绘制 ToggleButton --重写view
    ProgressBar 源码
    android rectF
    ActionBar
    Android源码
    子线程更新主线程的方法-转
  • 原文地址:https://www.cnblogs.com/cunchen/p/9464169.html
Copyright © 2020-2023  润新知