博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AtomicInteger源码解析
阅读量:4209 次
发布时间:2019-05-26

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

Java并发编程里不得不提java提供的高并发工具包,JUC包提供丰富的并发编程工具类,因此学习Java并发编程,JUC包就是学习的基础。在学习JUC包之前,我们先了解一下JUC的基本功能模块.

JUC并发包的基本结构体系

  atomic包:基于CAS策略的的原子类包。

  locks包:是基于AQS的抽象队列的同步框架,提供并发编程的同步锁。

  并发容器:提供高并发条件下的数据存储。

  并发计算框架:提供多线程执行框架。

  并发工具:实现上述框架的工具类。

AtomicInteger的实现原理

AtomicInteger采用基于CAS进行数据的原子性操作的Unsafe工具类,Unsafe类通过在对象实例化的时候记录数据的地址,并通过比较获取的原有数据与新获取数据是否一致来确定数据是否被其他线程修改,从而进行相关的数据操作。而对于数据的可见性,AtomicInteger采用volatile关键字进行修饰,使得线程对数据的操作均作用于主存,从而保证数据在多线程之间的可见性。AtomicInteger的初始化如下所示。

  //java操作内存的工具类,采用CAS能够操作内存。  private static final Unsafe unsafe = Unsafe.getUnsafe();  //数据在内存中偏移量  private static final long valueOffset;  static {      try {  //在对象进行实例化的时候将值得内存偏移地址设置到程序中。         valueOffset = unsafe.objectFieldOffset                (AtomicInteger.class.getDeclaredField("value"));        } catch (Exception ex) { throw new Error(ex); }    } //采用Volatile关键字来管理数据,volatile提供数据的可见性。 //volatile底层采用汇编指令load,cpu直接通过操作主存来控制所修饰的数据。  private volatile int value;

AtomicInteger提供的主要接口

AtomicInteger提供基本的数据操作,对于复杂的数据操作,其提供了lambda 表达式进行支持。我们只需将必要的逻辑写到lambda中即可。以下是AtomicInteger提供的主要接口。

  //先获取值,然后进行赋值  public final int getAndSet(int newValue);  //时候用CAS进行判断原数据是否被其他线程修改了  //如果被修改了则返回false,否则进行数据更新  public final boolean compareAndSet(int expect, int update);  //先获取,再进行加一赋值  public final int getAndIncrement();  //先获取,再进行减一赋值  public final int getAndDecrement();  //先获取,再进行加法赋值  public final int getAndAdd(int delta);    //先加一,再获取值  public final int incrementAndGet();   //先减一,再获取值 public final int decrementAndGet();  //添加再获取 public final int addAndGet(int delta);  //采用CAS进行赋值public final int getAndUpdate(IntUnaryOperator updateFunction);//更新赋值public final int updateAndGet(IntUnaryOperator updateFunction);//获取之后,进行复杂的数值操作public final int getAndAccumulate(int x,                         IntBinaryOperator accumulatorFunction);

                                                                                             

                                                             

转载地址:http://tlkmi.baihongyu.com/

你可能感兴趣的文章
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
登录linux密码验证很慢的解决办法
查看>>
fcntl函数总结
查看>>
HTML条件注释
查看>>
Putty远程服务器的SSH经验
查看>>
内核态与用户态
查看>>
使用mingw(fedora)移植virt-viewer
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>