# 深入理解 Java 虚拟机 (二)

深入理解 Java 虚拟机 (二)

Java内存模型

主内存与工作内存

  • 所有的变量存储在主内存(虚拟机内存的一部分)
  • 每条线程有自己的工作内存,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行、不能直接读写主内存中的数据。
  • 不同的线程无法直接访问对方工作内存中的变量。
    在这里插入图片描述

内存间交互操作

  • Java中,内存之间的交互操作通常是通过对象的引用来实现的。当一个对象被创建时,它被存储在堆内存中,并且在栈内存中分配一个引用指向该对象。通过这个引用,可以访问和操作对象的数据和方法。
8种基本操作
  • lock:锁定,作用于主内存变量,它把一个变量标识为一条线程独占的状态。

  • unlock:解锁,解锁后的变量才能被其他线程锁定。

  • read:读取,作用于主内存变量,它把一个主内存变量的值,读取到工作内存中。

  • load:载入,作用于工作内存变量,它把read读取的值,放到工作内存的变量副本中。

  • use:使用,作用于工作内存变量,它把工作内存变量的值传递给执行引擎,当JVM遇到一个变量读取指令就会执行这个操作。

  • assign:赋值,作用于工作内存变量,它把一个从执行引擎接收到的值赋值给工作内存变量。

  • store:存储,作用域工作内存变量,它把工作内存变量值传送到主内存中。

  • write:写入,作用于主内存变量,它把store从工作内存中得到的变量值写入到主内存变量中。

原子性可见性与有序性

原子性
  • 原子性是指一个操作或者多个操作要么全部执行并且对外部可见,要么都不执行,不会出现中间状态。
  • Java 中,通过 synchronized 关键字和 Lock 接口来实现原子性操作。
可见性
  • 可见性是指一个线程对共享变量的修改能够及时地被其他线程观察到。
  • Java 中,通过 volatile 关键字和 synchronized 关键字来实现可见性。
  • volatile 关键字可以保证共享变量的可见性,但不能保证原子性;synchronized 关键字可以保证共享变量的原子性和可见性。
有序性
  • 有序性是指一个线程中的操作按照程序代码的先后顺序执行,并且不会被重排序。
  • Java 中,由于处理器、编译器和虚拟机等因素的影响,程序代码中的操作可能会被重排序,从而导致多线程程序出现不可预期的结果。
  • 为了保证有序性,Java 提供了 happens-before 规则,用于定义操作之间的执行顺序。例如,一个unlock操作happens-before于后续对同一个锁的lock操作。

锁优化

自旋锁

  • 自旋锁(Spin Lock)是一种基本的锁实现方式,它是一种忙等待的锁,线程在获取锁时不会被挂起,而是循环检测锁的状态直到获取到锁为止。
  • 自旋锁适用于临界区代码执行时间非常短暂的情况,避免线程频繁地切换和阻塞,提高了锁的性能。

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

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

相关文章

VMware Windows sever 虚拟机互联网连接配置

一、VMware配置 1、虚拟网络编辑 从左上角 编辑→虚拟网络编辑器 进入 2、配置NAT模式 配置的子网IP,在虚拟机中获取到的ip跟子网IP的前三个是一样的 1.配置网关 2.配置DHCP设置 这个主要是分配ip最后一位获取的区间 3、虚拟机配置 二、Windows Server 虚拟机配置…

【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录 Ⅰ. 进程的概念(Process) 1. 什么是进程? 2. 多进程管理 3. 进程控制块(PCB) task_struct 的结构 Ⅱ. 进程查看与管理 1. 使用指令查看进程 2. /proc 查看进程信息 3. 获取进程 ID 4. 创建子进程 原因&…

Spring Boot中的自动配置机制详解

Spring Boot中的自动配置机制详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Spring Boot中的自动配置机制,这是Spring Boot…

STM32启动流程 和 map文件的作用

一,启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

如何用ChatGPT实现智能化编程

如何用ChatGPT实现智能化编程 ChatGPT,作为一个强大的AI助手,可以极大地提高编程效率,帮助更快地实现创新。本文将探讨如何利用ChatGPT辅助编程,从代码生成到优化,再到调试和学习新技术,全面提升编程体验。…

Jmeter TCP接口测试-实例

1、TCP接口结构 TCP接口:只有IP和PORT 传参数据类型根据开发定义的类型 需要添加一个ascii码的十进制字节结束符,tcp才会关闭 2、TCP接口环境搭建 在testfan-tcp-server.jar目录下,启动cmd命令行,输入: java -jar…

Socket编程【个人简单】

介绍 Socket是计算机网络中的一种通信端点,通过它应用程序可以在网络上发送和接收数据。它可以是基于TCP(传输控制协议)的流套接字,也可以是基于UDP(用户数据报协议)的数据报套接字。 TCP、UDP、HTTP和We…

Vim插件革命:Linux环境下的终极自动化编辑指南

在Vim中安装插件可以大大增强编辑器的功能。以下是详细的步骤来安装Vim插件: 1. 确认Vim版本 首先,确保你的Vim版本支持插件。在大多数现代Linux发行版中,Vim通常已经配置为支持插件。 vim --version2. 配置Vim 确保你的.vimrc文件允许使…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…

linux虚拟机部署docker时拉取image遇到的问题

1:防火墙问题 手动检查防火墙是否已经关闭 2:daemon.json问题 docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 192.168.152.2:443: connect: connection refused.解决 { "registry-mirrors&…

信创国产化大背景下的操纵系统开发之变:鸿蒙操作系统上的开发持续增多,为未来开发,必须知道的鸿蒙系统开发,现在很多国企都要求鸿蒙系统

鸿蒙操作系统的来龙去脉 1. 背景与动机 华为鸿蒙操作系统(HarmonyOS)是华为于2019年8月9日正式发布的分布式操作系统。鸿蒙的开发动机主要源于全球科技竞争的加剧以及华为在全球市场上面临的挑战。在被美国列入实体清单后,华为面临着使用安…

字符串匹配 --- BF算法 KMP算法

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇博客我们将介绍关于字符串匹配的BF算法以及KMP算法,请放心食用~ 🏠 字符串匹配 假设有一个字符串为主串str&#x…

Java之TimeUnit类

1.TimeUnit类介绍 TimeUnit(时间单元)是一个描述时间单元的枚举类,在该枚举类中定义有以下的几个时间单元实例:天(DAYS)、时(HOURS)、分(MINUTES)、秒&#…

2.移植freertos到stm32f103c8t6

目录 1.步骤 2.freertos配置时常见的选项卡意思 1.步骤 2.freertos配置时常见的选项卡意思

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器,定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠,交换物品…

深度解析:机器学习如何助力GPT-5实现语言理解的飞跃

文章目录 文章前言机器学习在GPT-5中的具体应用模型训练与优化机器翻译与跨语言交流:情感分析与问答系统:集成机器学习功能:文本生成语言理解任务适应 机器学习对GPT-5性能的影响存在的挑战及解决方案技术细节与示例 文章前言 GPT-5是OpenAI公…

24/06/26(1.1129)动态内存

strtok 字符串分割函数 #include<stdio.h> int main(){ char str[] "this,a sample string."; char* sep ","; char* pch strtok(str, sep); printf("%s\n", pch); while (pch ! NULL){ printf("%s\…

惊天大瓜姬圈天莱女明星出轨风波

#惊天大瓜&#xff01;姬圈天菜女明星出轨风波#近日&#xff0c;娱乐圈掀起了一场前所未有的风暴&#xff01;狗仔队放出重磅消息&#xff0c;直指某位姬圈天菜级别的女明星深陷出轨泥潭。消息一出&#xff0c;引发了网友们的热议和猜测&#xff0c;究竟这位神秘的女明星是谁&a…

深入理解 C++ 中的 const 和 constexpr

在 C 中&#xff0c;const 和 constexpr 是两个关键字&#xff0c;它们分别用于定义常量&#xff0c;但它们的使用场景和作用有所不同。理解它们的区别和联系对于编写高效和可靠的代码至关重要。 1. const 关键字 1.1 基本概念 const 关键字用于声明常量。被声明为 const 的…

各式各样神奇的注意力机制变型

当输入sequence N很大的时候&#xff0c;这个时候self-attention 占据了绝大部分算力 Local Attention / Truncated Attention 只需要关注附近的attention, local attention 和cnn 差不多&#xff0c;可以加速计算&#xff0c;但效果不一定好 Stride attention 空几格attenti…