1 简介
AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似。所以以AtomicLong对基本类型的原子类进行介绍。内容主要包括:
- AtomicLong介绍和函数列表
- AtomicLong源码分析(基于JDK1.8.0_251)
- AtomicLong示例
2 AtomicLong介绍和函数列表
AtomicLong是作用是对长整形进行原子操作。
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。
2.1 函数列表
1 | // 构造函数 |
3 AtomicLong 源码分析
- AtomicLong源码分析
AtomicLong的代码很简单,下面仅以incrementAndGet()为例,对AtomicLong的原理进行说明。
incrementAndGet()源码如下:
1 | public final long incrementAndGet() { |
说明:
(01) incrementAndGet()首先会根据get()获取AtomicLong对应的long值。该值是volatile类型的变量,get()的源码如下:
1 | // value是AtomicLong对应的long值 |
(02) incrementAndGet()接着将current加1,然后通过CAS函数,将新的值赋值给value。
compareAndSet()的源码如下:
1 | public final boolean compareAndSet(long expect, long update) { |
compareAndSet()的作用是更新AtomicLong对应的long值。它会比较AtomicLong的原始值是否与expect相等,若相等的话,则设置AtomicLong的值为update。
4 AtomicLong示例
1 | // LongTest.java的源码 |
运行结果:
1 | get() : 0x0123456789ABCDEF |