原子变量类

基本分类 (17个类):

  1. 基本类 AtomicInteger、AtomicLong、AtomicBoolean
  2. 引用类型 AtomicReference、AtomicStampedRerence、AtomicMarkableReference
  3. 数组类型 AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
  4. 属性原子修改器(Updater) AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
  5. DoubleAccumulator、DoubleAdder、LongAccumulator、LongAdder, 这几个类性能更好

CAS的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。CAS并不是无阻塞,只是阻塞并非在语言、线程方面,而是在硬件层面,所以无疑这样的操作会更快更高效!

volatile变量自身具有下列特性:

  • 可见性。对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入。
  • 原子性。对任意单个volatile变量的读、写具有原子性。
  • 轻量级多线程同步机制,不会引起上下文切换和线程调度。

volatile写-读建立的happen before关系

  • 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共赏变量值刷新到主内存。
  • 当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从内存中读取共赏变量。

Java中如何正确使用volatile

要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

  • 对变量的写操作不依赖于当前值。
  • 该变量没有包含在具有其他变量的不变式中。
  • 1写N读

AtomicInteger为了实现线程安全,使用了volatile和CAS。

AtomicStampedReference可以解决并发编程中的ABA问题。

results matching ""

    No results matching ""