Java 并发中原子变量

问:什么是原子变量?为什么需要他们?Java 提供了哪些原子变量类型?

答:原子变量就是原子操作,是在多线程环境下避免数据不一致必须的手段,譬如 int++ 就不是一个原子操作,因为当一个线程读取它的值并加 1 时另外一个线程有可能会读到之前的值而引发错误,所以为了解决这个问题就必须保证增加操作是原子操作,在 JDK1.5 之前可以使用 synchronized 同步技术来做到原子操作(成本太高,需要获取释放锁,获取不到锁还要等待,还有线程的上下文切换操作),而在 JDK1.5 的 java.util.concurrent.atomic 包中 Java 提供了可以自动保证是原子操作且不需要使用 synchronized 同步的实现类。

synchronized 是一种阻塞式算法的悲观锁,但是原子变量的更新逻辑是非阻塞式乐观的,synchronized 得不到锁就会进入等待状态和有线程切换开销,原子变量更新冲突时会循环重试,不会阻塞和上下文切换开销。

java 提供的原子变量类型都在 java.util.concurrent.atomic 包下面,基本的有:

  • AtomicBoolean(原子布尔类型)、AtomicInteger(原子Integer类型)、AtomicLong(原子Long类型)、AtomicReference(原子引用类型),

  • 针对基本的对应的数组类型有 AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray,

  • 为了便于以原子方式更新对象中字段而增加的类型有 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater,AtomicReference,

  • 还有两个类似的类 AtomicMarkableReference、AtomicStampedReference,

  • 对于 char、short、float、double 类型如果我们需要可以转换(floatToIntBits)为 int 或者 long 来使用。

你可能感兴趣的:(Java 并发中原子变量)