加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

小白篇:Java原子组件和同步组件

发布时间:2021-06-01 23:04:18 所属栏目:编程 来源:互联网
导读:在行使多线程并发编程的时,常常会碰着对共享变量修改操纵。此时我们可以选择ConcurrentHashMap,ConcurrentLinkedQueue来举办安详地存储数据。但假如单单是涉及

在行使多线程并发编程的时,常常会碰着对共享变量修改操纵。此时我们可以选择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)要领原子修改工具的属性

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读