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.xdnf.cn/news/148526.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql以key-val存储、正常存储的区别

场景 你作为一个服务端工程师,假设产品要求设计这么一个页面,页面上包含很多模块,每个模块都可以单独进行变更,有些模块是富文本。 实现方式有很多,我们来聊比较常用的两种,看看mysql的表如何设计。 第一…

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq,kafka两种消息队列进行发送数据,为了避免硬编码,在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案,仅供参考! 方案一:创建一个工具类,然后根据配置文…

一个案例熟悉使用pytorch

文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集:1.3.2 获取训练集、测试集长度:1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…

【Stm32-F407】Keil uVision5 的安装

文章内容如下: 1)Keil uVision5 安装包的获取2)Keil uVision5 的安装3)Keil uVision5 中 Stm32-F407 芯片包的获取与安装4)注册 Keil uVision5 1)Keil uVision5 安装包的获取 Keil uVision5 安装包链接: h…

华硕平板k013me176cx线刷方法

1.下载adb刷机工具, 或者刷机精灵 2.下载刷机rom包 华硕asus k013 me176cx rom固件刷机包-CSDN博客 3.平板进入刷机界面 进入方法参考: ASUS (k013) ME176CX不进入系统恢复出厂设置的方法-CSDN博客 4.解压ME176C-CN-3_2_23_182.zip,把UL-K013-CN-3.2.…

java图书信息管理

一、项目概述 本图书信息管理系统旨在提供一个直观的用户界面,用于管理图书馆或书店的图书信息。系统包括图书添加、查询、借阅和归还等功能。 二、系统架构 系统采用JavaSwing作为前端UI框架,后端使用Java Servlet处理业务逻辑,数据存储在…

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署

前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如:Adobe Premiere Pro,Final Cut Pro X,Davinci Resolve,HitFilm Express,它们都提供一些视频修…

ipaguard界面概览

ipaguard界面分左右2块:左边菜单导航栏,右边的功能区 左侧菜单:按模块分成启动界面,代码模块,文件模块,重签名与测试模块 右侧主功能区会随着功能变化,但是整体分3块,顶部显示过滤区…

数据指标体系

一、初识指标体系构建 1.1 什么是指标体系 指标体系是一个比较抽象的概念,指标体系是衡量、评估和监测特定领域或目标的系统化指标的集合。它由多个指标组成,这些指标可以用于衡量和评估所关注领域或目标的各个方面。指标体系通常被用于监测和评估业务绩…

柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?

第一印象非常重要。所以当你第一次见到某人时,留下一个好印象很重要,尤其是当你面对一个重要的工作或者面对某个对你来说可能非常特别的人时。 下面我列出了一些最常用的说“很高兴见到你”的表达方法,也包括对方的回答,除了nice …

Kaggle - LLM Science Exam上:赛事概述、数据收集、BERT Baseline

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、BERT Baseline2.1 数据预处理2.2 定义data_collator2.3 加载模型,配置trainer并训练2.4 预测结果并提交2.5 相关优化 前言:国庆期间…

用于数据增强的十个Python库

数据增强是人工智能和机器学习领域的一项关键技术。它涉及到创建现有数据集的变体,提高模型性能和泛化。Python是一种流行的AI和ML语言,它提供了几个强大的数据增强库。在本文中,我们将介绍数据增强的十个Python库,并为每个库提供…

springmvc-国际化中英文切换文件上传下载

1. 国际化 1.1 介绍 国际化(internationalization), 简称国际化。一个产品支持国际化是指产品在无需做大的改变就能够适应不同的语言和地区的能力。i18n是指是一种让软件在开发阶段就支持多种语言的技术。 1.2 java.util.Locale 该类对象表示了特定的地理&#…

GET 和 POST的区别

GET 和 POST 是 HTTP 请求的两种基本方法,要说它们的区别,接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求,或者已经看…

【Leetcode】 131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a","a"…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂,重启是一件非常麻烦的事 或者你在和前端同事联调,有一点小问题 你改完就要重启 前端还得等你,非常不友好 那…

docker基础命令

目录 一、安装docker 1、查看是否已安装docker 2、如果系统中已经存在旧的Docker 3、配置Docker的yum库 4、安装成功后,执行命令,配置Docker的yum源 5、安装Docker 6、启动和校验 7、配置镜像加速器,阿里云镜像加速为例 7.1、在首页的…

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案_已设置图床

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案 minikube dashboard报错 considerconsider-Dell-G15-5511:~$ minikube dashboard 🤔 正在验证 dashboard 运行情况 ... 🚀 正在启动代理... 🤔 正在验证 proxy 运行…

RDP协议流程详解(一)Connection Initiation阶段

Connetction Initiation是RDP连接的第一个阶段,具体包含两个消息RDP Negotiation Request和RDP Negotiation Response,下面结合协议数据包详细分析。 (1)RDP Negotiation Request 从数据包可以清晰看到此时的协议栈依次是TCP-TPKT…

swift加载h5页面空白

swift加载h5页面空白 problem 背景 xcode swift 项目,WebView方式加载h5页面本地h5地址是:http://localhost:5173/ 浏览器打开正常 Swift 加载h5: 百度官网 加载正常本地h5页面 加载空白,没有报错 override func viewDidLoad…