volatile
它是用来在多线程场景下,修改同一变量值的关键词,它可以使得线程可以安全地访问、操作共享变量。
这意味着多个线程能同时使用一个方法和实例,而不会出现任何问题。
该关键词不仅可以修饰Java的基本类型,还可以修改引用类型。
底层原理
上述所有描述都是现象,真正的底层原理是,基于JMM(Java Memor y Model),volatile关键字用来标记Java变量“存储在主内存中”。
更精确地说,对volatile变量的每次读取都会从计算机的主存中读取,而不是从CPU高速缓存中读取,每次写入volatile变量都会写入主存,而不仅仅是写入CPU缓存。
我们知道,当多个线程同时访问共享变量,必须考虑三个方面,包括原子性、可见性和顺序性。
原子性:表示当另一个线程对共享数据执行某些操作时,不应该有线程干扰;
可见性:表示行为对线程共享数据的影响应该可以被其他线程感知到;
顺序性:表示指令执行顺序应该与源代码中表达的顺序相同。
以上三个特性来对volatile进行分析的话,它具有:
可见性,对于一个volatile变量的读,始终可以看到(任意线程)对这个volatile变量较后的写入。
原子性,对任何单个volatile变量的读/写具有原子性。但对于复合操作没有原子性,比如i++等。
顺序性,volatile关键字禁止指令重排序,因此volatile在某种程度上可以增加有序性。