现如今,实战识我们处于一个新兴技术高速发展的实战识时代,各个产业对于开发人员的实战识需求更多、更高。实战识因此,实战识无论是实战识在入门阶段还是进阶阶段都需要学习大量的专业知识,不断提高对Java的实战识认识是必要的。 不论是实战识求职面试还是项目实际开发,volatile都是实战识一个需要掌握的知识点,今天,实战识我们就一起来认识volatile机制,实战识从实战中精进我们的实战识能力吧。 java是面向对象的高级编程语言,Java 语言包含两种内在的实战识同步机制:同步块(或方法)和 volatile 变量,volatile是实战识Java提供的一种轻量级的同步机制。源码库 在Java多线程的开发中有三种特性:原子性、可见性、有序性,使用volatile不会引起线程上下文的切换和调度,可以保证内存可见性和防止指令重排序。 在Java语言里,volatile关键字是用来修饰变量的,方式如下入所示。表示:该变量需要直接存储到主内存中。 被volatile关键字修饰的 int counter 变量会直接存储到主内存中。并且所有关于该变量的读操作,都会直接从主内存中读取,而不是直接从CPU缓存。 理解 volatile 关键字 对于初学者来说,volatile只是简单的了解,只知道volatile作用就是“保证可见性”、“禁止指令重排序”,但是仍然存在一些误区。 一个多线程应用中,出于计算性能的网站模板考虑,每个线程默认是从主内存将该变量拷贝到线程所在CPU的缓存中,然后进行读写操作的。现在电脑基本都是多核CPU,不同的线程可能运行的不同的核上,而每个核都会有自己的缓存空间。 volatile的出现,就是为了解决线程间不可见性,通过 volatile 修饰的变量,都会变得线程间可见。 解决多线程不可见的方式就是: (1) 可见性 任意一个线程修改了 volatile 修饰的变量,其他线程可以马上识别到最新值。实现可见性的原理如下。 (2) 互斥性 同一时刻只允许一个线程操作 volatile 变量,volatile 修饰的变量在不加锁的场景下也能实现有锁的效果,类似于互斥锁。上面的 VolatileFeaturesA.java 和下面的 VolatileFeaturesB.java 两个类实现的功能是一样的(除了 getAndAdd 方法)。 (3) 部分有序性 JVM 是使用内存屏障来禁止指令重排,从而达到部分有序性效果,了解到内存屏障类型,我们就可以解决那些因重排序引起的有序性问题。 什么是内存屏障呢?内存屏障其实就是一个CPU指令,在硬件层面上来说可以扥为两种:Load Barrier 和 Store Barrier即读屏障和写屏障。主要有两个作用: 在JVM层面上来说作用与上面的一样,但是种类可以分为四种: 实现有序性的原理: 如果属性使用了 volatile 修饰,在编译的时候会在该属性的前或后插入内存屏障来禁止指令重排。 首先一个变量被volatile关键字修饰之后有两个作用:何为Volatile?实战识为什么要用Volatile?
基本用法
特性及原理