当前位置: 首页 > article >正文

java并发编程-volatile的作用

文章目录

  • volatile的作用
    • 1.改变线程间的变量可见性
    • 2.禁止指令重排序
  • 参考的学习视频

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


http://www.kler.cn/a/378844.html

相关文章:

  • 学习虚幻C++开发日志——定时器
  • 推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
  • Swift 开发教程系列 - 第3章:控制流
  • PHP JSON 教程
  • 【系统架构设计师】2024年上半年真题论文: 论云上自动化运维级其应用(包括解题思路和素材)
  • JVM 复习1
  • 搜索引擎语法大全(Google、bing、baidu)
  • scala Map集合
  • MySQL45讲 第十二讲 为什么我的MySQL会“抖”一下?
  • 大数据新视界 -- 大数据大厂之提升 Impala 查询效率:索引优化的秘籍大揭秘(上)(3/30)
  • 「iOS」——知乎日报一二周总结
  • STL学习-关联容器-pair数对
  • 新老项目不同node版本,使用nvm控制node版本切换(mac、window)
  • Excel菜单选项无法点击?两种原因及解决方法全解析
  • 《Python 练习一百题:提升编程技能的宝藏》
  • 重生之我在Java世界------学工厂设计模式
  • Transformer 架构简单理解;GPT-3.5 的架构,向量长度为 :12288;Transformer架构改进:BERT和GPT
  • git创建一个公共子模块用于不同的项目共享这一个子模块
  • JWT-混淆算法
  • 鸿蒙HarmonyOS应用开发者(基础+高级)认证
  • uniapp下载文件的方案,包括H5,App方案解决办法
  • 如何使用Python WebDriver爬取ChatGPT内容(完整教程)
  • 数据结构,问题 C: 后缀表达式
  • Java NIO 【处理消息边界】
  • 基于 Spring Boot 和 Vue 的大学生入伍管理创新系统
  • CSS中display和visibility的区别