希望造成叫醒你的是梦想
而不是闹钟

目录

  • 类型
  • 常用方法
  • CAS
    • CAS与Atomic原子类
      • 自旋锁
    • CAS缺点

Atomic原子类:
在化学中,原子是构成一般物质的最小单位,是不可分割的。而在这里,Atomic 表示当前操作是不可中断的,即使是在多线程环境下执行,Atomic 类,是具有原子操作特征的类。

类型

基本类型
AtomicInteger:整形原子类
AtomicLong:长整型原子类
AtomicBoolean:布尔型原子类

引用类型
AtomicReference:引用类型原子类
AtomicStampedReference:原子更新引用类型里的字段原子类
AtomicMarkableReference :原子更新带有标记位的引用类型

对象的属性修改类型
AtomicIntegerFieldUpdater:原子更新整形字段的更新器
AtomicLongFieldUpdater:原子更新长整形字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,以及解决使用 CAS 进行原子更新时可能出现的 ABA 问题

常用方法

public final int get();  // 获取当前的值public final int getAndSet(int newValue);  // 获取当前的值,并设置新的值public final int getAndIncrement();  // 获取当前的值,并自增public final int getAndDecrement();  // 获取当前的值,并自减public final int getAndAdd(int delta);  // 获取当前的值,并加上预期的值boolean compareAndSet(int expect, int update);  // 如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update)public final void lazySet(int newValue);  // 最终设置为 newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

CAS

CompareAndSwap(比较并交换)
CPU并发原语,原子指令,执行连续,不会造成数据不一致性问题

CAS与Atomic原子类

AtomicInteger 类利用 CAS (Compare and Swap) + volatile + native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

看一下Atomic原子类源码

进入Atomic原子类的Unsafe类的compareAndSet方法

public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

UnSafe 类的 objectFieldOffset() 方法是个本地方法,这个方法是用来拿“原值”的内存地址,返回值是 valueOffset;另外,value 是一个 volatile 变量,因此 JVM 总是可以保证任意时刻的任何线程总能拿到该变量的最新值。

public native long objectFieldOffset(Field var1);

进去,compareAndSwapInt是一个native方法,底层直接通过objectFieldOffset拿到的内存地址进行交换

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

可见,通过do while循环中get()方法和updateFunction.applyAsInt(prev)获取比较值和交换值,通过调用native修饰的compareAndSwapInt进行CAS操作,达到修改值的目的

public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;
}

自旋锁

do while引出自旋锁,顺便手写一个自旋锁

public class ZiXuan {//保存线程static AtomicReference<Thread> atomicReference=new AtomicReference<>();public static void myLock(){//获取线程Thread thread = Thread.currentThread();//成功则退出循环while (!atomicReference.compareAndSet(null,thread)){}System.out.println(Thread.currentThread().getName()+"锁获取成功!");}public static void myUnLock(){Thread thread = Thread.currentThread();//成功则退出循环while (!atomicReference.compareAndSet(thread,null)){}System.out.println(Thread.currentThread().getName()+"释放锁成功!");}public static void main(String[] args) throws Exception {new Thread(()->{//获取锁System.out.println("已进去线程1");myLock();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}myUnLock();}).start();new Thread(()->{System.out.println("已进去线程2");//获取锁myLock();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}myUnLock();}).start();}
}

CAS缺点

● 循环时间长开销大

● 只能保证一个共享变量的原子操作

● ABA问题

简单来说:
一个线程把共享变量A修改为B再改为A,另一个线程看到还是A认为没修改过

解决:
使用带时间戳的原子引用

//参数需要带时间戳
AtomicStampedReference<Integer> asr = new AtomicStampedReference<>(100, 1);
//获取当前时间戳
int stamp = asr.getStamp();
//修改,时间戳不一致修改失败
asr.compareAndSet(100,200,stamp,2);

文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。

关于JCU并发包中的Atomic原子类及其CAS相关推荐

  1. JUC多线程:Atomic原子类与CAS原理

    一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...

  2. atomic原子类实现机制_JUC学习笔记--Atomic原子类

    Atomic 原子操作类包 Atomic包 主要是在多线程环境下,无锁的进行原子操作.核心操作是基于UnSafe类实现的CAS方法 CAS CAS: compareAndSwap :传入两个值:期望值 ...

  3. ConcurrentProgramming:Atomic 原子类

    ConcurrentProgramming:Atomic 原子类 关键词 方法基于CAS实现+自旋 AtomicInteger -> Unsafe的对象 -> CAS实现+自旋 一.Ato ...

  4. Atomic 原子类

    1 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思.在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的.在我们这里 Atomic 是指一个操作是不可中断的.即使是 ...

  5. Java多线程进阶面试-Atomic 原子类

    1.介绍一下 Atomic 原子类 Atomic 翻译成中文是原子的意思.在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的.在我们这里 Atomic 是指一个操作是不可中断的. ...

  6. Atomic 原子类总结

    Atomic 原子类总结 Atomic 原子类介绍 基本类型原子类 基本类型原子类介绍 AtomicInteger 常见方法使用 基本数据类型原子类的优势 AtomicInteger 线程安全原理简单 ...

  7. Atomic原子类常用方法总结(包含四大类型)

    基本介绍: Atomic指一个操作不可中断,即使在多线程情况下,一个操作一旦开始,就不会被其他线程干扰.如果多线程中仅需要Atomic原子类解决的事情,就不需要synchronized重量级锁了. 原 ...

  8. atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

  9. atomic原子类实现机制_并发编程:并发操作原子类Atomic以及CAS的ABA问题

    本文基于JDK1.8 Atomic原子类 原子类是具有原子操作特征的类. 原子类存在于java.util.concurrent.atmic包下. 根据操作的数据类型,原子类可以分为以下几类. 基本类型 ...

最新文章

  1. js加版本号 webpack_webpack脚手架增加版本号
  2. docker 简版教程
  3. Android文件存储方式之openFileOutput与获取数据openFileInput
  4. Android之内核学习笔记
  5. linux内核bios,BIOS的启动原理——Linux内核设计学习笔记
  6. Android 内存泄漏问题多多,怎么优化?
  7. data-packed volume container - 每天5分钟玩转 Docker 容器技术(43)
  8. linux到windows的ssh,ssh如何使用pxsh从linux到windows
  9. [SDK]新浪微博请求授权显示错误页面的解决方法
  10. 递归算法实例:阶乘(vb.net代码)
  11. 拿下国产高端市场第一背后,vivo与苹果、华为的共性
  12. java ape切割_无损分解和保持依赖的判断
  13. python里读取文件路径上一级路径及文件的方法
  14. virtualbox网络配置
  15. 【C++】gcd函数的写法
  16. 深度:企业为什么需要一个平台级的OA产品?
  17. CentOS7非桌面版关闭休眠和设置关闭盖子不休眠(server)
  18. http://blog.sina.com.cn/s/blog_7f5ad8c20101cnna.html#commonComment
  19. html标签360doc,360doc个人图书馆
  20. 快手2020校招笔试题 2019.8.25

热门文章

  1. 介绍属性与自定义属性、AttributeUsage
  2. 出场顺序很重要下一句_人生的出场顺序真的很重要
  3. 微博(MicroBlog)
  4. 论文笔记:Hashtag Recommendation for Multimodal Microblog Using Co-Attention Network
  5. 【细碎知识5】按字寻址和按字节寻址
  6. excel复制到plsql
  7. Python联动Excel入门教程(2--数据读取)
  8. 用python爬取爱课程首页所有的图片并下载到本地
  9. 蘑菇街获得mogujie商品详情 API 返回值说明
  10. 中飞院计算机学院毕业后侍遇,【毕业季·计算机学院】年华在指间流动,出门已是江湖...