Java并发包之AtomicXX

我们都知道java并发包下面总共有几大类:

1. 执行者与线程池

2. 并发队列

3. 同步工具

4. 并发集合

5. 锁

6. 原子变量

我们今天就来了解一下原子变量,也就是java.util.concurrent.atomic.AtomicXX,本文中就以AtomicInteger为例。

首先打开AtomicInteger类

/*** Atomically sets to the given value and returns the old value.

*

*@paramnewValue the new value

*@returnthe previous value*/

public final int getAndSet(intnewValue) {return unsafe.getAndSetInt(this, valueOffset, newValue);

}

可以看到几乎所有的方法都是通过一个叫Unsafe的类进行调用的,那这个Unsafe到底是一个什么东西呢。

Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。

这里就不做具体详细的讲解,后续会专门写篇文章来讲讲Unsafe类,我们只需要知道Unsafe调用的是一些底层其他语言(C/C++等)实现的API。

下面我们详细讲解getAndSet(int newValue)方法,里面的实现很简单,unsafe.getAndSetInt(this,valueOffset,newValue)

this和newValue不用讲,一个是当前对象,一个是需要set的值。

valueOffset是个什么东东,其实它是一个偏移量,可以简单的理解为一个地址,通过这个地址就能够获取变量的值。

继续点进去看看unsafe是怎么实现的

public final int getAndSetInt(Object obj, long valueOffset, intnewValue) {intoldValue;do{

oldValue= this.getIntVolatile(obj, valueOffset);

}while(!this.compareAndSwapInt(obj, valueOffset, oldValue, newValue));returnoldValue;

}

首先根据传进来的偏移量获取内存中要更新的变量的当前值

然后调用compareAndSwapInt方法进行值的更新,若更新成功则直接返回,若更新不成功则继续循环更新直至更新成功为止。

实际上这就是CAS方法。通过与内存中的值进行比较来保证更新,所有的一切都在this.compareAndSwapInt这个native方法里,这里面调用的是jvm里面的实现,有兴趣的可以去看看jvm实现

总的来说是需要依赖操作系统总线锁来保证原子性

java并发包 atomic_Java并发包之AtomicXX相关推荐

  1. Java集合及concurrent并发包总结(转)

    Java集合及concurrent并发包总结(转) 1.集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形 ...

  2. java pdfbox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存

    pdfbox开发包下载地址:http://pdfbox.apache.org/ 程序实现了PDF文档的创建,读入,与修改PDF内容并保存. 可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究 ...

  3. libnet发包java语言_Net-speeder多倍发包脚本

    net-speeder 在高延迟不稳定链路上优化单线程下载速度 A program to speed up single thread download upon long delay and uns ...

  4. java util下的并发包_jdk并发包下:使用java.util.concurrent.Executor线程池

    多线程,线程池Executor的接口类图: 其他都不重要,就ExecutorService是主要的: 基本上分为单纯线程池和定时任务线程池: 说白了除了ForkJoinPool所有都继承于Thread ...

  5. java平台利用jsoup开发包,抓取优酷视频播放地址与图片地址等信息。

    /********************************************************************************************  * aut ...

  6. java 信号量 闭锁_Java并发包之闭锁/栅栏/信号量

    二.同步工具类详解 1.Semaphore信号量:跟锁机制存在一定的相似性,semaphore也是一种锁机制,所不同的是,reentrantLock是只允许一个线程获得锁,而信号量持有多个许可(per ...

  7. python分发包_Python 分发包中添加额外文件的方法

    在制作一个 Python 分发包时经常需要把一些文件添加到包中.最常见的例子是你希望通过 pip install命令安装 Python 包时会在 /etc/ 等目录下自动添加默认配置文件,由此可以让 ...

  8. linux 查看进程 发包,Linux网络发包流程

    前段时间写了Linux网络收包流程一文,没想到很多人感兴趣,现上货网络发包流程. sys_write() file->f_op->write()(sock_writev)(注0) sock ...

  9. lua mysql发包_如何发包

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 先看2个例子 function OpenMailRecievedWindow() --confirmed Recieevd Mail list windo ...

  10. Java高并发程序设计(三)——JDK并发包(一)

    引言 读书读了一个多月了,这个月工作很多,空闲时间少,但是我还是在每天上班之前,下班之后挤出零星的时间写写博客,看看社区.每天下班以后,经常搜一些最近学习的相关知识点来加深理解.上次我介绍了前两章的内 ...

最新文章

  1. html固定中心,css 两边固定中间自适应布局的实现
  2. vue设置一个简单的计算器
  3. 【opencv】14.cv::cvtColor函数转换颜色空间时使用CV_RGB2BGR与CV_BGR2RGB结果一样的原因
  4. 一文搞清到底什么是 .NET?
  5. Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
  6. matlab GUI之自定义菜单小结
  7. 重磅 | 阿里AI labs百万美元年薪聘请两位顶级视觉科学家
  8. Leetcode 杂题
  9. java day of month_Java Calendar实例增加DAY_OF_MONTH作为递减(仅)HOUR或MINUTE的副作用
  10. mybatis的Mapper文件配置
  11. spring boot区分生产环境和开发环境
  12. 解决pre-commit hook failed (add --no-verify to bypass)的问题
  13. 简洁好用的Geek Unіnstaller
  14. 没有被遣返的人生是不完整的
  15. HBase(2):HBase数据模型
  16. 【渝粤教育】电大中专电子商务网站建设与维护 (6)作业 题库
  17. 十几岁的娃娃,下手咋这么狠
  18. 一文搞懂浏览器缓存机制
  19. Weston 纹理倒置(render-gl)
  20. 2008nian元旦

热门文章

  1. EfficientDet 论文记录
  2. 三分钟学会使用Pytorch.scatter函数
  3. Qt QSettings读写ini时 General 读不出来值
  4. mysql group by 用法解析(详细)
  5. 十款常见的开源数据库学习资料大汇总
  6. 微信开发源代码详细分析-微信开发教程6
  7. 安卓源代码_如何从在安卓Android手机获取微信小程序源代码
  8. javaExcel数据导出
  9. Windows窗口程序设计入门(C#版)
  10. 远程显示协议对比:RemoteFX vs. HDX vs. PCoIP