volatile关键字的做用

简介
Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操做通知到其余线程。volatile 变量具有两种特性:变量可见性、禁止重排序。缓存

做为同步锁
在访问 volatile 变量时不会执行加锁操做也就不会使执行线程阻塞,所以 volatile 变量是一种比 sychronized 关键字更轻量级的同步机制。
当对非 volatile 变量进行读写的时候,每一个线程先从内存拷贝变量到 CPU 缓存中。若是计算机有多个 CPU,每一个线程可能在不一样的 CPU 上被处理,这意味着每一个线程能够拷贝到不一样的 CPU cache 中。而声明变量是 volatile 的, JVM 保证了每次读变量都从内存中读,跳过 CPU cache这一步。安全

应用场景
volatile 变量的单次读/写操做是能够保证原子性的,如 long 和 double 类型变量,可是并不能保证 i++这种操做的原子性,由于本质上 i++是读、写两次操做。同时知足以下两个条件可保证在并发环境中的线程安全。
1)对变量的写操做不依赖于当前值(好比 i++),或者说是单纯的变量赋值( boolean flag = true) 。
2)该变量没有包含在具备其余变量的不变式中, 也就是说,不一样的 volatile 变量之间,不能互相依赖, 只有在状态真正独立于程序内其余内容时才能使用 volatile。并发

END线程

相关文章
相关标签/搜索