Java中的原子类

Java 的原子类

原子类,是 JUC(java.util.concurrent)包下封装的通过无锁的方式实现的一系列现场安全的原子操作类。

原子类的核心原理就是基于 CAS(Compare And Swap)。

CAS 的简单理解:给一个共享变量的内存地址,内存中应该的值(预期值,理解为更新前的值)和新值,然后通过 **一条 CPU 指令**来比较此内存地址中的值是否等于预期值,等于则替换内存地址中的值为新值,不等于则不予替换且换回。

也就是说硬件层面支持一条指令来实现这么几个操作,一条指令是不会被打断的,所以保证了原子性。

基本类型

通过下面的基本类型原子类,可以线程安全的更新这几个基本类型的值。

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong

数组类型

  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray

引用类型

  • AtomicReference
  • AtomicStampedReference
  • AtomicMarkableReference

是对象引用的原子化更新

差别在于 AtomicStampedReferenceAtomicMarkableReference 可以避免 CAS 的 ABA 问题

  • AtomicStampedReference 通过版本号 stamp 来避免
  • AtomicMarkableReference 通过一个布尔值 mark 来避免

ABA 问题

因为 CAS 是将期望值与内存地址上当时的值进行比较,假设期望值为1,地址上的值现在为1,但是中间被其他人改为了2,然后又改为了1,所以此时你 CAS 操作去对比是可以替换的,你无法得知值是否中间被修改过,这种情况就叫 ABA 问题。

解决 ABA 问题的做法就是使用版本号,每次修改时版本号 +1,这样即使是一样的值,版本号不同,就能得知之前被修改过。

属性更新类型

累加器类型

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信