[JUC第一天]浅谈volatile关键字
文章目录 概述 可见性 为什么有时会不可见 如何解决 防止重排序 一个有趣的例子 重排序会导致什么 内存屏障 原子性 什么是原子性 volatile变量不具有原子性 概述 在Java语言规范第三版中, volatile 关键词的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地使用和更新,线程应该确保通过排他锁单独获得这个变量 并发编程中有两个很常见的关键词: synchronized 和 volatile volatile 可以用来修饰一个变量,使得并发情况下所有线程得到这个对象的值都是一样的 相比与 synchronized 操作会找个东西当锁, volatile 则是通过实时共享变量的值的方式来保证变量的可见性的,而并没有锁什么东西,所以说他的使用并不会引起程序的上下文切换,所以也说,volatile是轻量级的synchronized volatile最大的两个特点就是: 使得内存模型中所有线程获取到的值都是统一的(可见性) 避免指令在执行的时候因为优化机制重排序而出错 可见性 内存可见性 :每一个工作线程看到的某个变量的值都是相同的,而且是他最新的状态 为什么有时会不可见 这首先就要从计算机的缓存说起了: 很久以前,计算机的CPU和内存是直接连着的,但是这样导致的是传输速度跟不上CPU的运算速度 后来的计算机中通过设置缓存的方式