ToB企服应用市场:ToB评测及商务社交产业平台

标题: JUC并发编程学习笔记(十五)JMM [打印本页]

作者: 不到断气不罢休    时间: 2023-12-7 20:47
标题: JUC并发编程学习笔记(十五)JMM
JMM

请你谈谈对Volatile的理解
Volatile是java虚拟机提供的轻量级的同步机制
1、保证可见性
2、不保证原子性
3、禁止指令重排
什么是JMM
JVM->java虚拟机
JMM->java内存模型,不存在的东西,概念!约定
关于JMM的一些同步的约定:
线程------->工作内存主内存


详见:Java内存模型(JMM)详解 - 程序新视界 - 博客园 (cnblogs.com)
在此交互过程中,Java内存模型定义了8种操作来完成,虚拟机实现必须保证每一种操作都是原子的、不可再拆分的(double和long类型例外)。
Java内存模型还规定了在执行上述8中基本操作时必须满足如下规则。
模拟主内存中数据被修改后未能获取到最新数据的子线程的工作内存状态
  1. package org.example.tvolatile;
  2. import java.util.concurrent.TimeUnit;
  3. public class JMMDemo01 {
  4.     //定义变量
  5.     private static Integer num = 0;
  6.     public static void main(String[] args) throws InterruptedException {
  7.         new Thread(()->{
  8.             //只要num=0就一直循环,来模拟主线程数据被改变后子线程的状态
  9.             while (num==0){
  10.             }
  11.             System.out.println("子线程执行结束,num已经不等于0了");
  12.         }).start();
  13.         //休眠疫苗等待子线程开启
  14.         TimeUnit.SECONDS.sleep(1);
  15.         //修改值
  16.         num=1;
  17.         System.out.println(num);
  18.     }
  19. }
复制代码
结果就是当主内存中的值已经被改变了,但是子线程中的工作内存不知道,所以还在一直循环

程序一直没有结束!
问题:子线程中的工作内存不知道主内存的值已经被修改过了
------------------>引出Volatile,Volatile就能解决这个问题

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4