博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java并发AtomicReference
阅读量:4365 次
发布时间:2019-06-07

本文共 3543 字,大约阅读时间需要 11 分钟。

java并发AtomicReference

AtomicReference的作用

已经介绍过AtomicInteger,AtomicIntegerArray,AtomicReference是针对对象的。

他通过CAS和volatile保证了对象操作的原子性和可见性,既然是引用,就会造成引用对象的变化。

public AtomicReference(V initialValue) {        value = initialValue;    }

如果value改变了对象的属性,initialValue的属性也会改变

CAS函数的实现

/**     * Atomically sets the value to the given updated value     * if the current value {@code ==} the expected value.     * @param expect the expected value     * @param update the new value     * @return {@code true} if successful. False return indicates that     * the actual value was not equal to the expected value.     */    public final boolean compareAndSet(V expect, V update) {        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);    }

例子

package javalearn.javabase.thread.atomic;import lombok.AllArgsConstructor;import lombok.Data;import lombok.ToString;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.atomic.AtomicReference;@Slf4jpublic class AtomicReferanceTest {    public static void main(String[] args) {        Persion p1 = new Persion("jack", 1);        Persion p2 = new Persion("linda", 2);        Persion p3 = new Persion("tony", 3);        log.info("persion 3 :{}",p3.toString());        AtomicReference
atomicReference =new AtomicReference(p3); log.info("AtomicReference is :{}",atomicReference.toString()); atomicReference.compareAndSet(p3,p1); log.info("AtomicReference is :{}",atomicReference.toString()); log.info("persion 3 :{}",p3.toString()); atomicReference.set(p2); log.info("AtomicReference is :{}",atomicReference.toString()); log.info("persion 3 :{}",p3.toString()); atomicReference.get().setId(33); log.info("AtomicReference is :{}",atomicReference.toString()); log.info("AtomicReference is :{}",atomicReference.toString()); log.info("persion 3 :{}",p3.toString()); log.info("persion 2 :{}",p2.toString()); } @AllArgsConstructor @Data @ToString static class Persion { private String name; private int id; }}

结果

13:34:22.313 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - persion 3 :AtomicReferanceTest.Persion(name=tony, id=3)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - AtomicReference is :AtomicReferanceTest.Persion(name=tony, id=3)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - AtomicReference is :AtomicReferanceTest.Persion(name=jack, id=1)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - persion 3 :AtomicReferanceTest.Persion(name=tony, id=3)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - AtomicReference is :AtomicReferanceTest.Persion(name=linda, id=2)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - persion 3 :AtomicReferanceTest.Persion(name=tony, id=3)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - AtomicReference is :AtomicReferanceTest.Persion(name=linda, id=33)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - AtomicReference is :AtomicReferanceTest.Persion(name=linda, id=33)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - persion 3 :AtomicReferanceTest.Persion(name=tony, id=3)13:34:22.321 [main] INFO javalearn.javabase.thread.atomic.AtomicReferanceTest - persion 2 :AtomicReferanceTest.Persion(name=linda, id=33)

转载于:https://www.cnblogs.com/JuncaiF/p/11298026.html

你可能感兴趣的文章
转换文件的字符集
查看>>
软件质量理解
查看>>
jquery 在 table 中修改某行值
查看>>
pyc文件是什么【转载】
查看>>
POM.xml 标签详解
查看>>
hdu 3635 Dragon Balls (并查集)
查看>>
文件操作
查看>>
7.java集合,泛型简单总结,IO流
查看>>
杭电2007 平方和与立方和
查看>>
JS邮箱验证-正则验证
查看>>
Quartz 2D绘图
查看>>
JS Fetch
查看>>
EJB 笔记
查看>>
【delete】Android自定义控件(四) 自定义ImageView动态设置ImageView的高度
查看>>
HDUOJ------(1230)火星A+B
查看>>
Servlet
查看>>
基于jquery地图特效全国网点查看代码
查看>>
【leetcode】867 - Transpose Matrix
查看>>
selenium动作链
查看>>
《设计你的人生》的部分经典语录
查看>>