java的内存模型(概念)

在java中,设计之初就有了:主内存、线程工作内存,所以其实每一个线程执行时,都是将主线程copy一份到工作线程,执行修改后,再同步回去。

所以,就有四组内存操作方式:

1、主内存,加载到工作内存

2、 通过执行引擎使用工作内存数据、修改工作内存

3、读工作内存、写到主内存

4、使用内存时会:加锁,解锁

 volatile可以让多个线程可见,或者说不再操作工作内存

package com.quxiao.controller;import java.sql.Time;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.stream.LongStream;/*** @program: package1* @author: quxiao* @create: 2023-09-27 15:22**/
public class t3 {static volatile int sum = 0;public static void main(String[] args) throws InterruptedException {new Thread(() -> {while (sum == 0) {}System.out.println(1);}).start();TimeUnit.SECONDS.sleep(1);sum = 1;}
}

但是使用了volatile就没有了原子性,也就是线程操作不再唯一,例如:

A线程取出时为10,正准备+10,数据变成了15,结果就成了15+10。

指令重排(很神奇的一个东西)

package com.quxiao.controller;import java.sql.Time;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.stream.LongStream;/*** @program: package1* @author: quxiao* @create: 2023-09-27 15:22**/
public class t3 {static int x = 0;static int y = 0;static int a = 0;static int b = 0;public static void main(String[] args) throws InterruptedException {//大致如此,但是new Thread(() -> {x = a;b = 1;}).start();new Thread(() -> {y = b;a = 2;}).start();//有可能x=2,y=1System.out.println(x + ":" + y);}
}

x=b和a=1这两句话完全没有关联,编译器就有可能把他俩重新排顺序。(上面的代码只是理论,其实很难遇到)

加上volatile,就能解决,多了两层内存屏障:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/126125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于comsol的压力声学-热黏性声学模块模拟一种具有多阶吸声的低频宽带薄超表面

研究背景: 由于传统材料的能量耗散较弱,低频吸声一直是研究人员面临的一个具有挑战性的课题。近年来,声学超材料发展迅速,具有前所未有的优异低频性能。已经设计了一系列亚波长厚度的超材料,以实现对低频声音的100%吸…

C++深入学习part_1

Linux下编译C程序 安装g命令:sudo apt install g 编译命令:$ g *.cc 或者 *.cpp -o fileName; hellworld 编译程序可以看到: namespace命名空间 首先,命名空间的提出是为了防止变量重名冲突而设置的。 浅浅试一下&#xff1…

【RabbitMQ 实战】08 集群原理剖析

上一节,我们用docker-compose搭建了一个RabbitMQ集群,这一节我们来分析一下集群的原理 一、基础概念 1.1 元数据 前面我们有介绍到 RabbitMQ 内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了 AMQP 协议消息…

云安全之等级保护解决方案及应用场景

等保2.0解决方案背景 适应云计算、移动互联网、大数据、物联网和工业控制等新技术发展,在新的技术场景能够顺利开展等级保护工作;《网络安全法》2016年已正式发布,等级保护2.0为了更好配合《网络安全法》的实施;等级保护1.0,在适…

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…

次方计数的拆贡献法(考虑组合意义)+限定类问题善用值域与位置进行ds:1006T3

对于多次方的计数问题可以考虑拆贡献。 题目问 ∣ S ∣ 3 |S|^3 ∣S∣3, ∣ S ∣ |S| ∣S∣ 表示选的点数。相当于在 ∣ S ∣ |S| ∣S∣ 中选了3次,也就是选了3个可相同的点。 先考虑3个不相同点的贡献,对应任意3个点,必然会对…

【GO 编程语言】面向对象

指针与结构体 文章目录 指针与结构体一、OOP 思想二、继承三、方法四、接口实现五、多态六、空接口七、接口继承八、接口断言九、Type别名 一、OOP 思想 Go语言不是面向对象的语言,这里只是通过一些方法来模拟面向对象,从而更好的来理解面向对象思想 面…

什么,这年头还有人不知道404

写在前面 哥,来帮我看看,这个请求怎么404了,明明接口路径是对的啊!一个下午,组里的小哥突然让我帮忙看这个问题,我不禁一惊,啥,这年头了还有人搞不定404,如有还有&#…

国庆中秋宅家自省: Python在Excel中绘图尝鲜

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 【一】国庆中秋: 悟 【国…

[React源码解析] React的设计理念和源码架构 (一)

任务分割异步执行让出执法权 文章目录 1.React的设计理念1.1 Fiber1.2 Scheduler1.3 Lane1.4 代数效应 2.React的源码架构2.1 大概图示2.2 jsx2.3 Fiber双缓存2.4 scheduler2.5 Lane模型2.6 reconciler2.7 renderer2.8 concurrent 3.React源码调试 1.React的设计理念 Fiber: 即…

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值 根据我们不同的处理方法,返回的数据格式都会不同,例如添加只返回true|false,删除同理,而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…

【二】spring boot-设计思想

spring boot-设计思想 简介:现在越来越多的人开始分析spring boot源码,拿到项目之后就有点无从下手了,这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到,源码分为两个模块: spring-boot-project&a…