java并发编程-volatile的作用

发布于:2024-11-03 ⋅ 阅读:(51) ⋅ 点赞:(0)

volatile的作用

1.改变线程间的变量可见性

每个线程都有一个专用的工作集内存,下图里面粉色的表示专用工作集内存,黄色的是共享内存工作区,如果加入了volatile,那么t1也会去查看黄色的共享内存工作区,以及时查看volatile变量的变化,这就是改变了“线程间的变量可见性”!
i修改之前:(不管有没有volatile的情况)
在这里插入图片描述
i没有volatile并且修改之后:
在这里插入图片描述
i有volatile并且修改之后:
在这里插入图片描述

在这里插入图片描述

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class Main {
//    volatile int i = 1;
    int i = 1;
    void task1() {
        System.out.println("开始");
        while (i == 1){

        }
        System.out.println("结束");
    }
    public static void main(String[] args) {
        Main main = new Main();
        new Thread(main::task1).start();
        try {
            TimeUnit.SECONDS.sleep(2   );
        } catch (Exception e) {
            e.printStackTrace();
        }
        main.i = 2;
    }
}

如何针对“线程不可见性”进行解决问题?
加入volatile修饰即可!

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class Main {
    volatile int i = 1;
// int i = 1;
    void task1() {
        System.out.println("开始");
        while (i == 1){

        }
        System.out.println("结束");
    }
    public static void main(String[] args) {
        Main main = new Main();
        new Thread(main::task1).start();
        try {
            TimeUnit.SECONDS.sleep(2   );
        } catch (Exception e) {
            e.printStackTrace();
        }
        main.i = 2;
    }
}

2.禁止指令重排序

这里不细说展开,直接给黑马学习视频链接,他讲解的十分清晰!!!看多几遍就好了!!!
【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】 https://www.bilibili.com/video/BV1yT411H7YK/?p=99&share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a
在这里插入图片描述

参考的学习视频

【【java并发】5分钟快速了解volatile关键字,上岸大厂有保证。】 https://www.bilibili.com/video/BV1WC4y1y7na/?share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a
2.
【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】 https://www.bilibili.com/video/BV1yT411H7YK/?p=99&share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a