java并发AtomicReference

AtomicReference的作用

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

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

  1. public AtomicReference(V initialValue) {
  2. value = initialValue;
  3. }

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

CAS函数的实现

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

例子

  1. package javalearn.javabase.thread.atomic;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.ToString;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.util.concurrent.atomic.AtomicReference;
  7. @Slf4j
  8. public class AtomicReferanceTest {
  9. public static void main(String[] args) {
  10. Persion p1 = new Persion("jack", 1);
  11. Persion p2 = new Persion("linda", 2);
  12. Persion p3 = new Persion("tony", 3);
  13. log.info("persion 3 :{}",p3.toString());
  14. AtomicReference<Persion> atomicReference =new AtomicReference(p3);
  15. log.info("AtomicReference is :{}",atomicReference.toString());
  16. atomicReference.compareAndSet(p3,p1);
  17. log.info("AtomicReference is :{}",atomicReference.toString());
  18. log.info("persion 3 :{}",p3.toString());
  19. atomicReference.set(p2);
  20. log.info("AtomicReference is :{}",atomicReference.toString());
  21. log.info("persion 3 :{}",p3.toString());
  22. atomicReference.get().setId(33);
  23. log.info("AtomicReference is :{}",atomicReference.toString());
  24. log.info("AtomicReference is :{}",atomicReference.toString());
  25. log.info("persion 3 :{}",p3.toString());
  26. log.info("persion 2 :{}",p2.toString());
  27. }
  28. @AllArgsConstructor
  29. @Data
  30. @ToString
  31. static class Persion {
  32. private String name;
  33. private int id;
  34. }
  35. }

结果


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

java并发AtomicReference的更多相关文章

  1. Java并发AtomicReference类

    java.util.concurrent.atomic.AtomicReference类提供了可以原子读取和写入的底层对象引用的操作,还包含高级原子操作. AtomicReference支持对底层对象 ...

  2. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  3. Java并发集合的实现原理

    本文简要介绍Java并发编程方面常用的类和集合,并介绍下其实现原理. AtomicInteger 可以用原子方式更新int值.类 AtomicBoolean.AtomicInteger.AtomicL ...

  4. Java 并发工具包 java.util.concurrent 用户指南

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  5. java并发:线程同步机制之Volatile关键字&原子操作Atomic

    volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchro ...

  6. Java并发编程实现概览

    并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通 ...

  7. 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

    Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...

  8. [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor

    这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ...

  9. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

随机推荐

  1. C语言:将字符串中的字符逆序输出,但不改变字符串中的内容。-在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。

    //将字符串中的字符逆序输出,但不改变字符串中的内容. #include <stdio.h> /************found************/ void fun (char ...

  2. SQL Server 2014安装(windows10)

    SQL Server 2014下载地址: 链接:https://pan.baidu.com/s/19_FAhoQxnxkTO_9e-e7weA 提取码:rid7

  3. Xcode创建子工程以及工程依赖

    https://www.jianshu.com/p/f2bc7d155a86 阅读 7858 视频地址 如果文章不详细,点击看操作视频 项目需求:代码抽层,业务逻辑和数据处理要高度抽离,模块化,需要将 ...

  4. win10 下安装 tesseract + tesserocr

    首先参考博文一贴:https://blog.csdn.net/u014179267/article/details/80908790 1.那么安装这两个模块是为了爬虫的时候识别验证码用的,但是安装的过 ...

  5. Spring Boot 整合MaBatis如何在控制台打印执行的SQL语句

    yml文件:logging: level: com.XXX.Mapper: debug (红色部分为Dao层的包名,注意不是XML文件的包名) properties文件: logging.level. ...

  6. WLC HA模式下的注意事项

    管理控制器:1.控制器默认开启的是SSH (CLI),Secure Web/https (GUI)2.登录控制器的管理地址为Active设备所控制(主备的配置同步,所以管理地址一致)3.WLC HA状 ...

  7. Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

    http://blog.csdn.net/on2way/article/details/47028969 http://blog.csdn.net/mokeding/article/details/1 ...

  8. shell脚本部署apache并能通过浏览器访问!

    第一步:导入httpd-2.2.17.tar包 第二步:创建一个test.sh文件(可在/root下) 第三步编写shell脚本 > 会重写文件,如果文件里面有内容会覆盖 >>这个是 ...

  9. MySQL 远程连接问题 (Linux Server)

    Mysql Workbench 连接Ubuntu上的Mysql时报如下错误: 原因:查看  /etc/mysql/mysql.conf.d/mysqld.cnf # # Instead of skip ...

  10. leetCode练题——9. Palindrome Number

    1.题目 9. Palindrome Number   Determine whether an integer is a palindrome. An integer is a palindrome ...