电脑:内存 L1 L2 L3 缓存 CPU ctrl+atl+del就可以看到

Java 有线程内存,在执行线程的时候,会从主内存把变量加载到工作内存(缓存),所以,在多线程同时改变一个静态变量时候,实际是分开相互不影响的

下面是程序例子

以下是运算结果

从此可以看出,第一个线程并没有退出,initFlag因为在第一个线程没有变成false,因为是工作内存

如果想让第一个内存的变量改变,加一个修饰 volatile

工作原理

在没有加volatile 时候,线程1没有store和write回主内存动作有,也没有重新读的过程,所以线程1一直在那空转,也没有改变。

volatile早期的解决方式,就是单例模式,有且只有一个线程可以访问到这个主内存的变量

MESI缓存原理 通过嗅探机制 发现主内存在总线里变了,就重新读取

查看 Java的汇编代码除了运行程序加以上的参数之外,还要下载工具到jre的bin下(hsdis-amd64)

结合配合以volatile的读/写和CAS所具有的volatile读和写的内存 ,AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类

上例子:

不保证原则性

t.join()是等待threads所有的线程都执行完,再去往下执行System.out.println(num);

第一次结果

第二次结果

因为volatile没办法保证原子性,在往主内存写的时候,可能多个线程同时写会一个值

线程1回写主内存后,线程2失效了,又重新读主内存到工作内存,值和线程1的一样,然后把工作内存写回主内存,就原来正常先后顺序是12,结果同时情况下就变成11

有序性

运行一下

运行结果是:四种组合结果都有可能 因为CPU会将指令重排序

所以 解决的方法就是在代码前加volatile

也就是,加了volatile的代码,CPU不会重排序把他前面那行代码放它后面去执行

后续需要继续学习的知识内容

JMM模型到并发编程相关推荐

  1. 管程模型解决并发编程

    提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 管程模型解决并发编程 前言 什么是管程 MESA 模型 wait() 的正确姿势 notify() 何时可以使用 总结 前言 管程技术 ...

  2. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  3. 第十六章:Java内存模型——Java并发编程实战

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  4. 高并发编程-重新认识Java内存模型(JMM)

    文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...

  5. java 并发存储,java并发编程——Java存储模型(JMM)

    --仅作笔记使用,内容多摘自<java并发编程实战> Java内存模型(JMM) JMM是Java并发编程的基础,了解JMM,可以帮助我们对并发编程的机制有更深入的了解,在了解JMM之前, ...

  6. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  7. 1. Java并发编程-Java内存模型

    并发问题的原因可以归结为三大类:可见性,有序性和原子性. 可见性的原因是CPU缓存,不同CPU之间缓存的数据互相之间不可见. 有序性的原因是编译优化(指令重排序) 原子性的原因是一条高级指令可能对应多 ...

  8. Java 并发编程解析 | 如何正确理解Java领域中的内存模型,主要是解决了什么问题?

    写在开头 这些年,随着CPU.内存.I/O 设备都在不断迭代,不断朝着更快的方向努力.在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异.CPU 和内存的速度差异可以形象地描述为:C ...

  9. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

最新文章

  1. 写出最感兴趣的软件测试工作,你还不会写测试用例?!注意这五点,写出模板级的测试用例!...
  2. 在ASP.NET MVC中进行排序
  3. 管理系统界面设计python_python图形化界面设计(wxpython)一布局管理
  4. 腾讯研发效率领先的秘密:高效率的工具
  5. 六. 异常处理7.throw:异常的抛出
  6. 霍因科技获首届全国信创产业生态创新奖
  7. HTML+CSS+JS实现 ❤️从亮到暗图片滤镜特效❤️
  8. 版本控制工具——Git常用操作(上)
  9. Dubbo视频教程(Dubbo项目实战)
  10. Spring 事务传播机制
  11. 再谈PHP从入门到精通需要几年
  12. 终于交作业了,View Design 的设计资源上线啦,免费哦
  13. linux7 显示任务,centos 7下计划任务详解之at
  14. Pygame:外星人入侵
  15. python量化策略——改进的美林时钟轮动策略(三)
  16. Linux从入门到跑路
  17. 好玩的Python彩蛋
  18. 【数据结构和算法】赫夫曼树 | 实战演练
  19. 点云处理:Kitti数据集中点云坐标转化到彩色摄像机坐标
  20. font-awesome图标显示问题解决方案

热门文章

  1. 【智能车Code review】——坡道图像与控制处理
  2. 关键字驱动测试示例_带有示例的False关键字
  3. PUBLISH.sql(复制的时候注意路径!!!)
  4. oracle平均活动会话数,Oracle11g r2的活动会话数问题解决
  5. JAVA和javascrito_JAVA 和JavaScript的split方法异同
  6. 清华大学计算机组成与体系结构,清华大学出版社-图书详情-《计算机组成与体系结构(第2版)》...
  7. CodeForces 570B,C
  8. C++学习笔记(一)
  9. 字符串题目 1 --------判断两个字符串是否为旋转词
  10. Ubuntu下QT的安装详细教程