JDK中提供了一系列的基于CAS实现的原子类,CAS 的全称是Compare-And-Swap
,底层是lock cmpxchg
指令,可以在单核和多核 CPU 下都能够保证比较交换的原子性。所以说,这些原子类都是线程安全的,而且是无锁并发,线程不会频繁上下文切换,所以在某些场景下性能是优于加锁。
本文就盘点一下JDK中的原子类,方便我们后续拿来使用。
AtomicInteger
:Integer整数类型的原子操作类AtomicBoolean
:Boolean类型的原子操作类AtomicLong
:Long类型的原子操作类这边以AtomicInteger
讲解下它的API和用法。
构造方法:
public AtomicInteger()
:初始化一个默认值为 0 的原子型 Integer
public AtomicInteger(int initialValue)
:初始化一个指定值的原子型 Integer
常用API:
public final int get()
: 获取 AtomicInteger 的值public final int getAndIncrement()
: 以原子方式将当前值加 1,返回的是自增前的值public final int incrementAndGet()
:以原子方式将当前值加 1,返回的是自增后的值public final int getAndSet(int value)
:以原子方式设置为 newValue 的值,返回旧值public final int addAndGet(int data)
:以原子方式将输入的数值与实例中的值相加并返回使用:
原理分析:
整体实现思路: 自旋(循环) + CAS算法
public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }
valueOffset
:偏移量表示该变量值相对于当前对象地址的偏移,Unsafe 就是根据内存偏移地址获取数据compareAndSwapInt()
再和主内存的值进行比较,假设方法返回 false,那么就一直执行 while 方法,直到期望的值和真实值一样,修改数据。AtomicInteger
的value
属性是volatile
类型,保证了多线程之间的内存可见性,避免线程从工作缓存中获取失效的变量。标签:Java,jdk,语言,运行环境,javac,高级语言,JVM 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。