Volatile

1、特征

        Volatile有两个特性,分别是可见性和有序性:

        1)可见性

        代表这个变量对于多线程是可见的,多线程拿到的volatile变量的值都是最新的。具体的实现方式是:共享变量在每个线程中都有一个变量副本,每个线程修改变量副本后都会刷新到主内存里,每个线程读取变量副本都会直接从主内存中读取最新的变量值。

        2)有序性

        代表这个变量的执行有序的,即禁止了指令重排(happens-before,一种重排内存指令的机制,可以通过重排内存指令提高执行效率)。具体的实现方式是:在对volatile变量写的时候,加了一个内存屏障,禁止重排,这样内存指令就可以有序执行。

2、用途

        1)用于boolean标识

        Volatile如果用来修饰boolean值,是不存在原子性问题的,因为boolean值赋值本来就是原子操作。这样,各线程之前可以通过修改boolean变量,通知其它线程是否某种操作。

        2)用于生成线程安全的对象

        Volatile的禁止指令重排的机制,可以用在生成线程安全的对象上,因为在多线程情况下,对象的赋值操作是包括多次内存操作的,分别是:申请一块内存空间;对象初始化;把对象指向内存空间。如果不使用volatile禁用指令重排,会导致多线程拿到错误的对象。

        3)用于快速通知其它线程当前数据

        Volatile的可见性保证了多线程之前数据是可见的,因此如果需要获取数据后,让其它线程也知道,可以使用volatile修饰。

你可能感兴趣的:(Volatile)