原子变量类
基本分类 (17个类):
- 基本类 AtomicInteger、AtomicLong、AtomicBoolean
- 引用类型 AtomicReference、AtomicStampedRerence、AtomicMarkableReference
- 数组类型 AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- 属性原子修改器(Updater) AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
- DoubleAccumulator、DoubleAdder、LongAccumulator、LongAdder, 这几个类性能更好
CAS的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。CAS并不是无阻塞,只是阻塞并非在语言、线程方面,而是在硬件层面,所以无疑这样的操作会更快更高效!
volatile变量自身具有下列特性:
- 可见性。对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入。
- 原子性。对任意单个volatile变量的读、写具有原子性。
- 轻量级多线程同步机制,不会引起上下文切换和线程调度。
volatile写-读建立的happen before关系
- 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共赏变量值刷新到主内存。
- 当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从内存中读取共赏变量。
Java中如何正确使用volatile
要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
- 对变量的写操作不依赖于当前值。
- 该变量没有包含在具有其他变量的不变式中。
- 1写N读