小白篇:Java原子组件和同步组件
在行使多线程并发编程的时,常常会碰着对共享变量修改操纵。此时我们可以选择ConcurrentHashMap,ConcurrentLinkedQueue来举办安详地存储数据。但假如单单是涉及状态的修改,线程执行次序题目,行使Atomic开头的原子组件可能ReentrantLock、CyclicBarrier之类的同步组件,会是更好的选择,下面将逐一先容它们的道理和用法 原子组件的实现道理CAS AtomicBoolean、AtomicIntegerArray等原子组件的用法、 同步组件的实现道理 ReentrantLock、CyclicBarrier等同步组件的用法 原子组件的实现道理CAS cas的底层实现可以看下之前写的一篇文章:详解锁道理,synchronized、volatile+cas底层实现[1] 应用场景 可用来实现变量、状态在多线程下的原子性操纵 可用于实现同步锁(ReentrantLock) 原子组件 原子组件的原子性操纵是靠行使cas来自旋操纵volatile变量实现的 volatile的范例变量担保变量被修改时,其他线程都能看到最新的值 cas则担保value的修改操纵是原子性的,不会被间断 根基范例原子类 AtomicBoolean //布尔范例 AtomicInteger //正整型数范例 AtomicLong //长整型范例 行使示例 public static void main(String[] args) throws Exception { AtomicBoolean atomicBoolean = new AtomicBoolean(false); //异步线程修改atomicBoolean CompletableFuture<Void> future = CompletableFuture.runAsync(() ->{ try { Thread.sleep(1000); //担保异步线程是在主线程之后修改atomicBoolean为false atomicBoolean.set(false); }catch (Exception e){ throw new RuntimeException(e); } }); atomicBoolean.set(true); future.join(); System.out.println("boolean value is:"+atomicBoolean.get()); } ---------------输出功效------------------ boolean value is:false 引用类原子类 AtomicReference //加时刻戳版本的引用类原子类 AtomicStampedReference //相等于AtomicStampedReference,AtomicMarkableReference体谅的是 //变量是否照旧原本变量,中间被修悔改也无所谓 AtomicMarkableReference AtomicReference的源码如下,它内部界说了一个volatile V value,并借助VarHandle(详细子类是FieldInstanceReadWrite)实现原子操纵,MethodHandles会资助计较value在类的偏移位置,最后在VarHandle挪用Unsafe.public final native boolean compareAndSetReference(Object o, long offset, Object expected, Object x)要领原子修改工具的属性 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |