Java JVM:Java 内存模型与线程(七)

news2024/12/24 9:09:22

  衡量一个服务性能的高低好坏,每秒事物处理数(TPS)是重要的指标之一,而 TPS 值与程序的并发能力又有非常密切的关系

目录

    • 一、硬件的效率与一致性
    • 二、Java 内存模型
    • 三、Java 与线程

这里是看书笔记,之前文章也有相关介绍:Java JMM:内存模型

一、硬件的效率与一致性

  • 内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象
  • 为了充分利用运算单元,处理器对输入的代码进行乱序执行优化,在计算后将乱序执行的结果重组

二、Java 内存模型

  • Java 内存模型的主要目的是定义程序中各种变量的访问规则,Java 多线程内存模型跟 cpu 缓存模型类似,基于 cpu 缓存模型来建立,Java 线程内存模型是标准化的,屏蔽掉了底层不同计算机的区别
  • 主内存与工作内存
    • Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存
    • 不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成
  • 内存间交互操作
    • Java 虚拟机必须对下面的操作都是原子的、不可再分的
      • lock(锁定):把一个变量标识为一条线程独占的状态,作用在主内存
      • unlock(解锁):把一个处于锁定状态的变量释放出来,作用在主内存
      • read(读取):把一个变量的值从主内存传输到线程的工作内存中,作用在主内存
      • load(载入):把 read 操作从主内存中得到的变量值放入工作内存的变量副本中,作用在工作内存
      • use(使用):把工作内存中一个变量的值传递给执行引擎,作用在工作内存
      • assign(赋值):把一个从执行引擎接收的值赋给工作内存的变量,作用在工作内存
      • store(存储):把工作内存中一个变量的值传送到主内存,作用在工作内存
      • write(写入):把 store 操作从工作内存中得到的变量值放入主内存的变量中,作用在主内存
    • 主内存拷贝到工作内存,按顺序执行 read 和 load 操作,从工作内存同步回主内存,按顺序执行 store 和 write 操作
  • 对于 volatile 型变量的特殊规则
    • volatile 可以说是 Java 虚拟机提供的最轻量级的同步机制
    • 定义 volatile 两项特性
      • 保证此变量对所有线程的可见性
        • 可见性:一条线程改了变量的值,其他线程能立即得知
        • 基于 volatile 变量的运算在并发下是线程安全的
        • 仍然要加锁来保证原子性
          • 遇到运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值
            变量不需要与其他的状态变量共同参与不变约束
      • 禁止指令重排序优化
        • 硬件架构上,允许将多条指令不按程序规定的顺序分开发送给各个相应的电路单元进行处理
    • volatile 变量读操作的性能消耗与普通变量几乎没有什么差别
  • 针对 long 和 double 型变量的特殊规则
    • 允许虚拟机将没有被 volatile 修饰的 64 位数据类型的 load、store、read 和 write 这四个操作的原子性,这就是 “long 和 double” 的非原子性协定
    • 针对 double 类型,由于现代中央处理器一般都有专门的浮点运算器FPU,专门处理单、双精度的浮点数据,所以不会出现非原子性访问的问题
  • 原子性、可见性与有序性
    • 原子性
      • 由 Java 内存模型来直接保证的原子性变量操作包括 read、load、assign、use、store 和 write 留个
        • 可以认为基本数据类型的访问、读写都是具备原子性的
      • 更大范围的原子性保证需要使用 lock 和 unlock 来操作
      • synchronized 块之间的操作也具备原子性
    • 可见性
      • 一个线程修改了变量,其他线程也能立刻得知
      • volatile 特殊规则保证了新值能立即同步到主内存,每次使用前立即从主内存刷新
      • synchronized 和 final 也能实现可见性
        • 同步块对一个变量 unlock 操作之前,必须先把此变量同步回主内存
        • final 初始化完成,构造器没有把“ this ”引用传递出去,那么在其他线程中就能看见 final 字段对值
    • 有序性
      • 线程内观察,所有操作都是有序的,在一个线程看另一个线程所有操作都是无序的
      • volatile 和 synchronized 保存线程之间有序
        • volatile 有禁止指令重排序的语义
        • synchronized 一个变量在同一个时刻只允许一条线程对其进行 lock 操作
    • 绝大部分并发控制操作都能使用 synchronized 来完成
  • 先行发生原则
    • Java 内存模型中所有的有序性都仅靠 volatile 和 synchronized 来完成
    • 先行发生是 Java 内存模型中定义的两项操作之间的偏序关系
      • A 先行发生于 B,A 产生的影响被 B 观察到
    • 程序次序规则、管程锁定规则、volatile 变量规则、线程启动规则、线程终止规则、线程中断规则、对象终结规则、传递性
    • 时间先后顺序与先行发生原则之间基本没有因果关系,所以我们衡量并发安全问题的时候不受时间顺序干扰,一切以先行发生原则为准

三、Java 与线程

  • 线程的实现
    • 线程是比进程更轻量级的调度执行单位,线程是 Java 里面进行处理器资源调度的最基本单位
    • Thread 类所有关键方法都是 Native
      • Native 方法往往就意味着这个方法没有使用或无法使用平台无关的手段来实现
    • 内核线程(KLT)实现:直接由操作系统内核支持的线程,1:1 实现
      • 程序一般不会直接使用内核线程,而是使用内核线程的一种高级接口–轻量级进程(LWP)
      • 轻量级进程局限性
        • 基于内核线程实现,各种线程操作都需要进行系统调用
    • 用户线程实现:1:N 实现
      • 广义上:只要不是内核线程,都可以认为是用户线程的一种
      • 狭义上:完全建立在用户空间的线程库上
    • 混合实现:N:M 实现
      • 内核线程与用户线程一起使用
    • Java 线程的实现
      • HotSpot:每一个 Java 线程都是直接映射到一个操作系统原生线程来实现
  • Java 线程调度
    • 协同式线程调度
      • 线程的执行时间由线程本身来控制,要主动通知系统切换到另外一个线程上
      • 好处:实现简单
      • 坏处:线程执行时间不可控制,会由于一个线程导致整个进程甚至系统阻塞(一个线程有问题,不通知系统切换线程)
    • 抢占式线程调度
      • 每个线程使用时间由系统来分配执行时间,线程的执行时间是由系统控制,不会出现一个线程导致整个系统阻塞的问题
      • Java 使用的线程调度方式就是抢占式调度
  • 状态转化
    • 新建(New):创建后尚未启动的线程
    • 运行(Runnable):有可能正在执行,也可能在等待操作系统分配执行时间
    • 无限期等待(Waiting):等待其他线程显式唤醒
    • 限期等待(Timed Waiting):一定时间之后由系统自动唤醒
    • 阻塞(Blocked):线程阻塞,等待获取到一个排他锁,这个事件将在另一个线程放弃这个锁的时候发生,程序等待进入同步区域的时候。
    • 结束(Terminated):已终止线程的线程状态

在这里插入图片描述

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

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

相关文章

操作系统权限提升(八)之系统错误配置-注册表键AlwaysInstall提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

异质性区域下的宏观基本图构建

这是我们发表在Physica A: Statistical Mechanics and its Applications期刊上的一篇论文,主要是对现在的宏观基本图构建进行了一定的优化,论文详见:https://www.sciencedirect.com/science/article/pii/S0378437123000869 1.论文概述 论文…

stream操作常用API 示例详解

简介 从JDK8开始,增加了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑。 流式操作主要用来处理数据(比如集合),…

Java两大工具库:Commons和Guava(4)

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!在Nginx中提到过…

说一下Vue组件中的自定义事件和全局事件总线

一,自定义事件 1.自定义事件是什么 自定义事件一种组件间通信的方式,适用于 子组件 ——> 父组件传输数据等 2.要在什么地方使用 若App是父组件,School是子组件,School想给App传数据,那么就要在App中给School绑…

MySQL表中的聚合查询

聚合查询在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!1.聚合函数函数 说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DIST…

pod访问不通问题--kube-proxy未正常创建

用户问题Pod创建后访问对象存储OSS不通。初步排查初步排查,网络连通性是OK的。再次反馈创建Pod后2分钟内可能存在业务不通。业务架构该集群采用了节点自动弹缩功能,节点弹缩范围在13-28之间。用户周期性创建大批量Pod,共300个,与对…

46_API接口漏洞

API接口漏洞 一、概念 api > application interface 应用接口 向特定的接口发送一个请求包 返回一个类似于json格式的字符串 二、REST型web service 可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类 https://blog.csdn.net/t79036912/article…

Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘

1. 设置NAS,共享目录 1. 文件服务 设置 首先进入NAS服务,打开 [控制面板] ,在控制面版包含** 文件服务 ** 功能如图所示。 2.选中要共享的文件夹后,点击操作栏的 【编辑】 按钮,如图: 3.进入编辑面板后&a…

盘点三个超好用的截图软件

一款好用的截图软件往往能给人们带来更高的工作效率,目前市面上的截图软件已经很多,今天就给大家盘点一些好用的截图软件。 QQ截图 QQ截图软件是QQ内置自带的一款截图,快捷键ctrlA 可以唤起,其功能也是应有尽有包括屏幕录制&#…

【JavaScript】数据劫持(代理)详解

💻 【JavaScript】数据劫持(代理)详解 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻…

3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐

theme: channing-cyan highlight: github-gist 本人6年前端开发老鸟- 【程序员蜗牛】,欢迎沟通交流 操作演示(视频) 视频演示 项目背景 程序员工作中,不免会遇到一些技术难题,然后通过不懈努力将问题攻克&#xf…

1x1卷积、Inception网络、

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高,1x1卷积能压缩通道数量,减少计算成本。如上图,输入维度的通道数为192,用32个1x1x192的filters,就能将输出的通道数压…

【Rust】20. Rust 的高级特征

20.1 不安全 Rust 20.1.1 不安全的超能力 20.1.2 解引用裸指针 裸指针(raw pointers):类似于引用类型;和引用一样,裸指针是不可变或可变的,分别写作 *const T 和 *mut T,这里的星号不是解引用运…

Kubernetes集群部署与实践

一、提要 部署Kubernetes集群至少需要3台服务器,其中至少要有1个服务器做master节点,至少要有1个服务器做node节点,且节点名称是唯一的。 当集群中只有一个master节点时,如果其出现了故障,会导致Kubernetes的控制平面…

规则引擎-drools-5-决策表

文章目录Excel格式决策表 官网地址决策表使用方式Excel组成部分与drl规则文件对应关系Excel文件内容示例drl规则文件内容Excel决策表内容说明1. RuleSet2. RuleTable3. Attributes示例Excel转化drl代码及结果执行drl代码及结果Excel格式决策表 官网地址 决策表这部分内容在官网…

几种IO模型

IO真正的IO操作涉及到和IO设备的交互,而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互,一般会使用操作系统的System Call,即系统调用,读是read(),写是write()&#xf…

设计模式-结构型模式

目录 5.结构型模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 JDK动态代理 5.1.5 CGLIB动态代理 5.1.6 三种代理的对比 5.1.7 优缺点 5.1.8 使用场景 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 应…

聊聊关于矩阵反向传播的梯度计算

目录 1. 前向传播 2. 反向传播 3. 矩阵反向传播 4. 总结 1. 前向传播 建立如图所示的简单网络 W 是权重矩阵,初始赋值为 2*2 的矩阵 X 是输入特征,初始赋值为 2*1 的矩阵 这样通过矩阵乘法 , Y WX ,应该得到一个 2*1 的输…

在这竞争激烈的时代,如何才能够在激烈竞争中脱颖而出呢

不管是在职场想要获得认可得到晋升,还是与客户谈合作;都需要你能够脱颖而出。让他人能够看到你并且认可你。那如何才能脱颖而出呢?首先你要先认识自己,知道自己有什么优势、劣势、技能、兴趣、爱好等等。明确自己有什么价值&#…