由前面文章介绍可以知道, 引起线程安全问题有
五个原因, 分别是:
线程抢占式执行, 随即调度(根本原因); 多个线程对同一变量执行
修改操作;
非原子操作;
内存可见性问题;
指令重排序. 而第二第三可以通过
上锁来解决, 第四第五需要用到
volatile关键字, 今天将介绍
volatile关键字
本月鸡汤:
人之所以痛苦, 在于追求错误的东西.
什么是内存可见性问题
所谓内存可见性, 就是当两个线程同时访问一个变量, 其中一个变量发生变化时, 另一个线程能够及时获取该变量的最新值, 注意区分这里的内存可见性和之前的脏读, 不可重复读
那么内存安全性问题便是当两个线程同时访问一个变量, 其中一个变量发生变化时, 另一个线程无法获取该变量最新值, 这个问题要使用volatile来解决
引起内存可见性问题的原因
– 先看如下代码和其运行结果:
import java.util.Scanner;
public class ThreadDome1 {
int a = 0;
public static void main(String[] args) {
ThreadDome1 t = new ThreadDome1();
Thread t1 = new Thread(()->{
while(t.a == 0)

内存可见性问题是多线程环境下,一个线程修改变量后,其他线程无法立即看到变化的现象。该问题由JVM优化导致,如非原子操作、编译器优化等。使用volatile关键字能解决这个问题,确保每次读取都是最新的值,但不保证原子性。volatile只能修饰全局变量,不适用于局部变量。在多线程编程中,根据具体情况结合volatile和synchronized使用。
最低0.47元/天 解锁文章
5257

被折叠的 条评论
为什么被折叠?



