AtomicInteger学习
面试时被问到了,补下
- import java.util.concurrent.atomic.AtomicInteger;
- /**
- * Created by tzq on 2018/7/15.
- */
- public class TestAtomic {
- /**
- * @param java中的原子操作类AtomicInteger
- * @author yangcq
- *
- * 关于AtomicInteger的说明(来自官方文档注解)
- * /**
- * An {@code int} value that may be updated atomically. See the
- * {@link java.util.concurrent.atomic} package specification for
- * description of the properties of atomic variables. An
- * {@code AtomicInteger} is used in applications such as atomically
- * incremented counters, and cannot be used as a replacement for an
- * {@link java.lang.Integer}. However, this class does extend
- * {@code Number} to allow uniform access by tools and utilities that
- * deal with numerically-based classes.
- *
- * @since 1.5
- * @author Doug Lea
- */
- public static void main(String[] args) {
- // 初始值为1
- AtomicInteger atomicInteger = new AtomicInteger(1);
- System.out.println("--初始值atomicInteger = " + atomicInteger);
- // 以原子方式将当前值加1,注意这里返回的是自增前的值
- System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.getAndIncrement());
- System.out.println("--自增后的 atomicInteger = " + atomicInteger);
- // 以原子方式将当前值减1,注意这里返回的是自减前的值
- System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.decrementAndGet());
- System.out.println("--自减后的 atomicInteger = " + atomicInteger);
- // 以原子方式将当前值与括号中的值相加,并返回结果
- System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.addAndGet(11));
- System.out.println("--自增后的 atomicInteger = " + atomicInteger);
- // 如果输入的值等于预期的值,则以原子方式将该值设置成括号中的值
- //atomicInteger等于第一个参数返回true 并将第二个参数赋值
- System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.compareAndSet(12, 2));
- System.out.println("--自减后的 atomicInteger = " + atomicInteger);
- System.out.println("atomicInteger.getAndIncrement() = " + atomicInteger.compareAndSet(10, 9999));
- System.out.println("--自减后的 atomicInteger = " + atomicInteger);
- /**
- * 一,AtomicInteger 是如何实现原子操作的呢?
- *
- * 我们先来看一下getAndIncrement的源代码:
- * public final int getAndIncrement() {
- * for (;;) {
- * int current = get(); // 取得AtomicInteger里存储的数值
- * int next = current + 1; // 加1
- * if (compareAndSet(current, next)) // 调用compareAndSet执行原子更新操作
- * return current;
- * }
- * }
- *
- * 这段代码写的很巧妙:
- * 1,compareAndSet方法首先判断当前值是否等于current;
- * 2,如果当前值 = current ,说明AtomicInteger的值没有被其他线程修改;
- * 3,如果当前值 != current,说明AtomicInteger的值被其他线程修改了,这时会再次进入循环重新比较;
- *
- * 注意这里的compareAndSet方法,源代码如下:
- * public final boolean compareAndSet(int expect, int update) {
- * return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
- * }
- *
- * 调用Unsafe来实现
- * private static final Unsafe unsafe = Unsafe.getUnsafe();
- *
- * 二,java提供的原子操作可以原子更新的基本类型有以下三个:
- *
- * 1,AtomicBoolean
- * 2,AtomicInteger
- * 3,AtomicLong
- *
- * 三,java提供的原子操作,还可以原子更新以下类型的值:
- *
- * 1,原子更新数组,Atomic包提供了以下几个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- * 2,原子更新引用类型,也就是更新实体类的值,比如AtomicReference<User>
- * AtomicReference:原子更新引用类型的值
- * AtomicReferenceFieldUpdater:原子更新引用类型里的字段
- * AtomicMarkableReference:原子更新带有标记位的引用类型
- * 3,原子更新字段值
- * AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
- * AtomicLongFieldUpdater:原子更新长整形的字段的更新器
- * AtomicStampedReference:原子更新带有版本号的引用类型的更新器
- *
- *
- */
- }
- }
四,AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
- import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
- /**
- * Created by tzq on 2018/7/16.
- */
- public class Test_AtomicIntegerFieldUpdater {
- /**
- * @param AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
- * @author yangcq
- */
- // 创建原子更新器,并设置需要更新的对象类和对象的属性
- private static AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater
- = AtomicIntegerFieldUpdater.newUpdater(User.class, "age1");
- public static void main(String[] args) {
- // 设置age的初始值为1000
- User user = new User();
- user.setUserName("yangcq");
- user.setAge(1000);
- user.setAge1(500);
- // 原子更新引用数据类型的字段值
- System.out.println(atomicIntegerFieldUpdater.getAndIncrement(user));
- // 更新以后的值
- System.out.println(atomicIntegerFieldUpdater.get(user));
- System.out.println(user.getAge());
- System.out.println(user.getAge1());
- }
- //实体类User
- public static class User{
- private String userName;
- public volatile int age;
- public volatile int age1;
- // setter、getter方法
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public int getAge1() {
- return age1;
- }
- public void setAge1(int age1) {
- this.age1 = age1;
- }
- }
- }
AtomicInteger学习的更多相关文章
- CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
自我学习:一.线程安全日期格式化操作的几种方式:1.每次new一个新对象:public static Date parse(String date) throws ParseException { r ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
- JUC学习笔记--Atomic原子类
J.U.C 框架学习顺序 http://blog.csdn.net/chen7253886/article/details/52769111 Atomic 原子操作类包 Atomic包 主要是在多线程 ...
- (二)Netty源码学习笔记之服务端启动
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html 本文将不会对netty中每个点分类讲解,而是一个服务端启 ...
- Android 学习笔记之Volley开源框架解析(二)
PS:Volley已经学完,可以安心的写一下博客总结一下了... 学习内容: 1.Request的完整封装... 2.RetryPolicy,DefaultRetryPolicy(请求重试策略源码解析 ...
- java 学习之路
一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- 从使用到原理学习Java线程池
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...
随机推荐
- web前端图片上传
图片上传有很多种形式,但是听说ios只能传字符串,所以为了安卓.ios和web能用一个接口上传图片,采用了基于base64 的方法上传图片. 下面是我的html <div class=" ...
- Android Studio 代码无提示,无颜色区分
一.问题 ①java代码没有颜色区分,统一黑色 ②代码不会联想提示,原来打前几个字母便会联想到后面的内容 二.解决 打开File,将Power save Mode的勾勾去掉
- [Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件
1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...
- Ehcache入门经典:第二篇ehcache.xml的参数
继续第一篇 diskStorepath:指定在硬盘上存储对象的路径path属性可以配置的目录有: user.home(用户的家目录) user.dir(用户当前的工作目录) java.io.tmpdi ...
- C# Tostring()方法
在C#中 JArray japroimg = new JArray(); strproimg.ToString();这样会导致tostring之后的字符串中会有大量的空格 使用 japroimg.T ...
- python之单元测试_生成测试报告
(1)HTMLTestRunner.py的下载路径:https://pan.baidu.com/s/1Yk2E8d8bIo5_rmpussOE9Q 提取码:0jae (2)HTMLTestRunner ...
- Django学习开发--笔记一(从零开始)
创建django项目注: 首先需在python中下载django 命令:pip install django1.任意文件中创建django项目 diango-admin startproject my ...
- 周末班:Python基础之并发编程
进程 相关概念 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...
- .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...
- bat——批量删除文件文件夹
bat批处理,在工作中会带来很多便利. 例如:想删除多个文件夹内的文件夹“Quality”及其子文件 同时删除所有Cyc*文件夹内的所有R00*.tif文件 则可如下操作 先建立父bat文件run_d ...