java.util.concurrent.atomic随笔及volatile语义

 

一个原子操做(atomic operation)是个不能分割的总体,没有其它线程(thread)可以中断或检查正在原子操做中的变量。一个原子(atomic)类型就是一个原子操做可用的类型,它能够在基本上没有锁(lock)的状况下作到线程安全(thread-safe)。java

java.util.concurrent.atomic包就是提供原子操做的类的小工具包,支持在单个变量上解除锁定的线程安全编程。包中的类将volatile值、字段和数组元素的概念扩展到那写也支持原子条件更新操做的类。如AtomicReference,一个“能够用原子方式更新的对象引用”。编程

JDK的文档中说:“设计原子类主要用做各类块,用于实现非阻塞数据结构和相关基础结构类compareAndSet()方法不是锁定的常规替换方法。仅当对象的重要更新限于单个变量时才应用它”数组

类图解:缓存

java.util.concurrent.atomic随笔及volatile语义 - javaee_chen - javaee_chen的博客

?从类图中能够清晰的得出:这些基本都是实现java经常使用的基本类型及他们的数组的原子实现。


volatile语义安全

volatile至关于synchronized的弱实现,也就是说volatile实现了相似synchronized的语义,却又没有锁机制。它确保对volatile字段的更新以可预见的方式告知其余的线程。数据结构

volatile包含如下语义:app

(1)Java 存储模型不会对valatile指令的操做进行重排序:这个保证对volatile变量的操做时按照指令的出现顺序执行的。工具

(2)volatile变量不会被缓存在寄存器中(只有拥有线程可见)或者其余对CPU不可见的地方,每次老是从主存中读取volatile变量的结果。也就是说对于volatile变量的修改,其它线程老是可见的,而且不是使用本身线程栈内部的变量。也就是在happens-before法则中,对一个valatile变量的写操做后,其后的任何读操做理解可见此写操做的结果。atom

尽管volatile变量的特性不错,可是volatile并不能保证线程安全的,也就是说volatile字段的操做不是原子性的,volatile变量只能保证可见性(一个线程修改后其它线程可以理解看到此变化后的结果),要想保证原子性,目前为止只能加锁!spa

应用volatile变量的三个原则:

(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量

(2)变量的状态不须要与其它变量共同参与不变约束

(3)访问变量不须要加锁

相关文章
相关标签/搜索