面试时被问到了,补下

  1. import java.util.concurrent.atomic.AtomicInteger;
  2.  
  3. /**
  4. * Created by tzq on 2018/7/15.
  5. */
  6. public class TestAtomic {
  7.  
  8. /**
  9. * @param java中的原子操作类AtomicInteger
  10. * @author yangcq
  11. *
  12. * 关于AtomicInteger的说明(来自官方文档注解)
  13. * /**
  14. * An {@code int} value that may be updated atomically. See the
  15. * {@link java.util.concurrent.atomic} package specification for
  16. * description of the properties of atomic variables. An
  17. * {@code AtomicInteger} is used in applications such as atomically
  18. * incremented counters, and cannot be used as a replacement for an
  19. * {@link java.lang.Integer}. However, this class does extend
  20. * {@code Number} to allow uniform access by tools and utilities that
  21. * deal with numerically-based classes.
  22. *
  23. * @since 1.5
  24. * @author Doug Lea
  25. */
  26. public static void main(String[] args) {
  27. // 初始值为1
  28. AtomicInteger atomicInteger = new AtomicInteger(1);
  29. System.out.println("--初始值atomicInteger = " + atomicInteger);
  30.  
  31. // 以原子方式将当前值加1,注意这里返回的是自增前的值
  32. System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.getAndIncrement());
  33. System.out.println("--自增后的 atomicInteger = " + atomicInteger);
  34.  
  35. // 以原子方式将当前值减1,注意这里返回的是自减前的值
  36. System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.decrementAndGet());
  37. System.out.println("--自减后的 atomicInteger = " + atomicInteger);
  38.  
  39. // 以原子方式将当前值与括号中的值相加,并返回结果
  40. System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.addAndGet(11));
  41. System.out.println("--自增后的 atomicInteger = " + atomicInteger);
  42.  
  43. // 如果输入的值等于预期的值,则以原子方式将该值设置成括号中的值
  44. //atomicInteger等于第一个参数返回true 并将第二个参数赋值
  45. System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.compareAndSet(12, 2));
  46. System.out.println("--自减后的 atomicInteger = " + atomicInteger);
  47. System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.compareAndSet(10, 9999));
  48. System.out.println("--自减后的 atomicInteger = " + atomicInteger);
  49.  
  50. /**
  51. * 一,AtomicInteger 是如何实现原子操作的呢?
  52. *
  53. * 我们先来看一下getAndIncrement的源代码:
  54. * public final int getAndIncrement() {
  55. * for (;;) {
  56. * int current = get(); // 取得AtomicInteger里存储的数值
  57. * int next = current + 1; // 加1
  58. * if (compareAndSet(current, next)) // 调用compareAndSet执行原子更新操作
  59. * return current;
  60. * }
  61. * }
  62. *
  63. * 这段代码写的很巧妙:
  64. * 1,compareAndSet方法首先判断当前值是否等于current;
  65. * 2,如果当前值 = current ,说明AtomicInteger的值没有被其他线程修改;
  66. * 3,如果当前值 != current,说明AtomicInteger的值被其他线程修改了,这时会再次进入循环重新比较;
  67. *
  68. * 注意这里的compareAndSet方法,源代码如下:
  69. * public final boolean compareAndSet(int expect, int update) {
  70. * return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
  71. * }
  72. *
  73. * 调用Unsafe来实现
  74. * private static final Unsafe unsafe = Unsafe.getUnsafe();
  75. *
  76. * 二,java提供的原子操作可以原子更新的基本类型有以下三个:
  77. *
  78. * 1,AtomicBoolean
  79. * 2,AtomicInteger
  80. * 3,AtomicLong
  81. *
  82. * 三,java提供的原子操作,还可以原子更新以下类型的值:
  83. *
  84. * 1,原子更新数组,Atomic包提供了以下几个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
  85. * 2,原子更新引用类型,也就是更新实体类的值,比如AtomicReference<User>
  86. * AtomicReference:原子更新引用类型的值
  87. * AtomicReferenceFieldUpdater:原子更新引用类型里的字段
  88. * AtomicMarkableReference:原子更新带有标记位的引用类型
  89. * 3,原子更新字段值
  90. * AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
  91. * AtomicLongFieldUpdater:原子更新长整形的字段的更新器
  92. * AtomicStampedReference:原子更新带有版本号的引用类型的更新器
  93. *
  94. *
  95. */
  96. }
  97.  
  98. }

四,AtomicIntegerFieldUpdater:原子更新整形的字段的更新器

  1. import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
  2.  
  3. /**
  4. * Created by tzq on 2018/7/16.
  5. */
  6. public class Test_AtomicIntegerFieldUpdater {
  7.  
  8. /**
  9. * @param AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
  10. * @author yangcq
  11. */
  12.  
  13. // 创建原子更新器,并设置需要更新的对象类和对象的属性
  14. private static AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater
  15. = AtomicIntegerFieldUpdater.newUpdater(User.class, "age1");
  16.  
  17. public static void main(String[] args) {
  18.  
  19. // 设置age的初始值为1000
  20. User user = new User();
  21. user.setUserName("yangcq");
  22. user.setAge(1000);
  23. user.setAge1(500);
  24.  
  25. // 原子更新引用数据类型的字段值
  26. System.out.println(atomicIntegerFieldUpdater.getAndIncrement(user));
  27. // 更新以后的值
  28. System.out.println(atomicIntegerFieldUpdater.get(user));
  29. System.out.println(user.getAge());
  30. System.out.println(user.getAge1());
  31. }
  32.  
  33. //实体类User
  34. public static class User{
  35. private String userName;
  36. public volatile int age;
  37. public volatile int age1;
  38.  
  39. // setter、getter方法
  40. public String getUserName() {
  41. return userName;
  42. }
  43. public void setUserName(String userName) {
  44. this.userName = userName;
  45. }
  46. public int getAge() {
  47. return age;
  48. }
  49. public void setAge(int age) {
  50. this.age = age;
  51. }
  52.  
  53. public int getAge1() {
  54. return age1;
  55. }
  56.  
  57. public void setAge1(int age1) {
  58. this.age1 = age1;
  59. }
  60. }
  61.  
  62. }

AtomicInteger学习的更多相关文章

  1. CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介

    自我学习:一.线程安全日期格式化操作的几种方式:1.每次new一个新对象:public static Date parse(String date) throws ParseException { r ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

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

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

  4. JUC学习笔记--Atomic原子类

    J.U.C 框架学习顺序 http://blog.csdn.net/chen7253886/article/details/52769111 Atomic 原子操作类包 Atomic包 主要是在多线程 ...

  5. (二)Netty源码学习笔记之服务端启动

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html  本文将不会对netty中每个点分类讲解,而是一个服务端启 ...

  6. Android 学习笔记之Volley开源框架解析(二)

    PS:Volley已经学完,可以安心的写一下博客总结一下了... 学习内容: 1.Request的完整封装... 2.RetryPolicy,DefaultRetryPolicy(请求重试策略源码解析 ...

  7. java 学习之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...

  8. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  9. 从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

随机推荐

  1. web前端图片上传

    图片上传有很多种形式,但是听说ios只能传字符串,所以为了安卓.ios和web能用一个接口上传图片,采用了基于base64 的方法上传图片. 下面是我的html <div class=" ...

  2. Android Studio 代码无提示,无颜色区分

    一.问题 ①java代码没有颜色区分,统一黑色 ②代码不会联想提示,原来打前几个字母便会联想到后面的内容 二.解决 打开File,将Power save Mode的勾勾去掉

  3. [Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件

    1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...

  4. Ehcache入门经典:第二篇ehcache.xml的参数

    继续第一篇 diskStorepath:指定在硬盘上存储对象的路径path属性可以配置的目录有: user.home(用户的家目录) user.dir(用户当前的工作目录) java.io.tmpdi ...

  5. C# Tostring()方法

    在C#中 JArray japroimg = new JArray(); strproimg.ToString();这样会导致tostring之后的字符串中会有大量的空格 使用  japroimg.T ...

  6. python之单元测试_生成测试报告

    (1)HTMLTestRunner.py的下载路径:https://pan.baidu.com/s/1Yk2E8d8bIo5_rmpussOE9Q 提取码:0jae (2)HTMLTestRunner ...

  7. Django学习开发--笔记一(从零开始)

    创建django项目注: 首先需在python中下载django 命令:pip install django1.任意文件中创建django项目 diango-admin startproject my ...

  8. 周末班:Python基础之并发编程

    进程 相关概念 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...

  9. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  10. bat——批量删除文件文件夹

    bat批处理,在工作中会带来很多便利. 例如:想删除多个文件夹内的文件夹“Quality”及其子文件 同时删除所有Cyc*文件夹内的所有R00*.tif文件 则可如下操作 先建立父bat文件run_d ...