【Java并发详解】

news2024/11/15 15:54:49

参考书目:
请添加图片描述
请添加图片描述
堆和方法区中的数据是可以被共享的
堆中的数据是被栈中的变量所持用的,栈是线程隔离的,每个线程私有一个栈,所以栈中的数据不共享
请添加图片描述
调用a方法时,jvm会给a方法创建一块内存区,让其入栈,这块区域被称为a的栈帧,调用b方法、c方法时,同理
如果多个线程访问同一个成员变量,需要加锁,但是如果在方法内定义了一个局部变量,局部变量时是线程私有的,没必要加锁,除非这个局部连量指向了成员变量,即堆中的数据,产生了共享,才需要对局部变量加锁
请添加图片描述
执行n++这条语句,cpu会将高级语言转换成机器语言,在底层执行时,会先将n加载到寄存器并初始化为0,再进行n++,再将值写入内存,执行完(以上三步的)任意一步都可能进行线程切换,这就是原子性问题
请添加图片描述
假如操作系统是单核的,在并发时,先将线程1的n加载到寄存器并初始化为0,此时线程切换了,(执行线程2的n++语句),将线程2的n加载到寄存器并初始化为0,然后执行线程2的n=n+1,然后将线程2的n=1写入内存,此时线程切换了,继续执行线程1,将线程1的n=n+1,因为线程1的n为初始值0,所以此时n=1,接下来将n=1写入内存。问题:执行了两次n++,但结果是n=1。

在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

请添加图片描述
cpu与内存通过缓存交互,内存与硬盘的交互也是类似的,因为内存比硬盘快,缓存比内存快
请添加图片描述
假如操作系统是双核的,有两个cpu,内存中有一个变量x,cpu1的线程a要修改x:将x加载进缓存,线程a在缓存中修改,改完了将x同步回内存,cpu2的线程b要修改x也是这个逻辑,假如两个线程同时修改x,同时同步回内存,会发生冲突,这就是可见性问题
请添加图片描述
以执行下述代码为例:

// 创建一个单例对象
if(instance == null){
	instance = new Singleton();
}

代码执行顺序应该是:判断instance == null,如果为true,则在内存中分配一块空间R,R中存放Singleton实例对象,然后把R的地址给instance变量,但是为了提高性能,编译器和处理器会对指令重排序,可能在内存中分配完空间R,就将R的地址给instance变量了,然后再往R中存放Singleton实例对象,如果是按照这个顺序的话,执行完R的地址给instance变量之后,线程切换了,线程b从头开始执行这段代码,判断结果肯定是false,于是他直接返回instance,但是此时的instance中并没有Singleton实例对象,于是出问题了。
请添加图片描述
请添加图片描述
共享内存:一个线程把数据放在共享的内存中,另一个线程去取
消息传递:一个线程给另一个线程发送消息
请添加图片描述
假如线程a与线程b进行通信,线程a将数据写入本地内存a,然后本地内存a将数据刷到主内存中,线程b将数据读取到本地内存b中,线程b就可以访问数据了,由jmm控制两个线程的读写顺序
请添加图片描述
请添加图片描述
这是内存重排序的例子,执行线程a时,先执行A1,将数据刷到缓冲区A中,假如现在还没有将缓冲区A的内容同步到内存,然后执行A2,因为b是线程b的,所以需要去内存中取(线程A可能将b读到缓冲区A中,然后再去缓冲区A中取,但是不管怎么说都是去内存中取),然后将缓冲区A的内容同步到内存,此时从内存的角度来看,先执行A2再执行A1,因为A3是A1的延续,所以会出现x=0的情况,同理,y=0
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
JMM可以解决内存可见性问题及编译器重排序问题:happens-before,
如果是cpu导致的重排序,通过内存屏障解决,如果是编译器导致的重排序,通过规则、JMM解决
请添加图片描述

总结:

  1. 并发编程的目标:解决通信同步的问题
  2. Java采用的并发编程模型是共享内存模型,该模型被称为JMM
  3. JMM解决了内存可见性问题,内存可见性问题就是两个线程谁先访问谁后访问的问题,即访问顺序问题
  4. 重排序有三种:编译器重排序、cpu重排序、内存系统重排序
  5. 如果是cpu导致的重排序,通过插入内存屏障解决,代码在unsafe类中,编译时插入内存屏障代码
  6. 如果是编译器导致的重排序,通过happens-before规则解决(6点)

请添加图片描述
写内存时,是立刻讲缓存中的数据刷新到主内存,读内存时,是直接从主内存中读
请添加图片描述
volatile只保证可见性不保证原子性,他只保证对单个变量读写的可见性(顺序/原子性)
请添加图片描述
可见性、有序性解决了,原子性也解决了

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

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

相关文章

UIRecorder安装、录制、回放

Github地址:https://github.com/alibaba/uirecorder/blob/master/README_zh-cn.md 支持 android ios 和pc端的自动化脚本录制。无线native app(Android, iOS)录制是,是基于macaca实现的:https://macacajs.com 整体组成架构 UIRecorder录制功…

Dubbo服务开发和运行流程【java面试】

(1)问题分析:考官主要想考核dubbo的原理,还有dubbo在项目中的使用。(2)核心答案讲解:dubbo服务开发流程:maven工程中pom文件先导入dubbo依赖jar包搭建zookeeper注册中心写好服务端工程并配置dubbo服务端配置,并关联上z…

Spring概览——最佳入门实践

1、Spring Framework Spring 基础框架,可以视为 Spring 基础设施,基本上任何其他 Spring 项目都是以 Spring Framework 为基础的。 1.1、Spring Framework特性 建议新手先看完的最佳实践,再回头看这一段。 非侵入式:使用 Spri…

Java List按照某字段去重

Java List按照某字段去重嘚吧嘚distinct示例一示例二根据某个字段去重Collectors.collectingAndThen()嘚吧嘚 Java8流的新类java.util.stream.Collectors实现了java.util.stream.Collector接口,同时又提供了大量的方法对流(stream)的元素执行各种统计操作。 distinc…

实战: 跨年烟花代码的实现(附源码)

目录 前言 一、pandas是什么? 二、代码结构 1.介绍主html代码 2. js文件介绍 GameCanvas.js script.js 运行效果 前言 本文章将介绍跨年烟花代码的实现以及源代码 提示:以下是本篇文章正文内容 一、pandas是什么? 示例:pandas …

css3-动画

目录语法转换平移旋转缩放复合属性的顺序问题过渡动画帧动画案例案例1-热点图dot(缩放)案例2-热点图dot(缩放)案例3-开红包(旋转)问题问题1-transform不起作用问题2 - 过渡动画不起效果语法 转换 css3中的转换允许我们对元素进行旋转、缩放、移动或倾斜。它分为2D转换 或 3D转…

开箱即用的物联网平台-IoTLink

物联网平台是物联网生态系统的重要组成部分,也是一个快速增长的市场,物联网平台为企业提供了巨大的价值,使他们能够降低开发成本、加速启动和简化流程。 一个完整的物联网系统需要硬件、连接、软件、用户界面等。在较高的层面上,…

menuconfig的执行过程

menuconfig (1)首先在uboot源码顶层目录下的Makefile文件中查找config(%表示省略) (2)执行make menuconfig,分别打印输出$(MAKE)、$(bulid)、$可知其对应的内容,如上图所示 总结&a…

用docker部署django后台作为webstack的后台管理系统-其二

0 序言 在之前的博客中: 用docker部署webstack导航网站-其一https://blog.csdn.net/qq_41938259/article/details/128736551?spm1001.2014.3001.5501我成功的将webstack官方推荐的docker容器部署了出来,但是官方的docker容器后端使用的是PHP&#xff0…

08_FreeRTOS列表和列表项讲解

目录 列表和列表项的简介 列表 列表项 迷你列表项 列表和列表项的关系 列表相关API函数介绍 初始化列表vListInitialise函数详解 列表项的初始化函数vListInitialiseItem函数 列表项的插入vListInsert函数 列表项末尾插入vListInsertEnd函数 列表项的删除函数uxLis…

零入门容器云网络实战-5->路由知识总结

本篇文章主要用于收集、整理、总结路由相关知识点。 1、路由分为几种? 直连路由静态路由(基本静态路由,等价静态路由,活动静态路由,缺省静态路由)动态路由 通过路由协议从相邻路由器学习到的。路由协议&am…

一,SpringMVC入门

0 MVC设计模式 View(视图):页面(jsp、html),接收用户数据和显示结果。 Controller(控制器):action,接收请求,决定程序执行流程。 Model&#xf…

【深度学习】——循环神经网络RNN及实例气温预测

引言 密集连接网络和卷积神经网络都有主要的特点,那就是它们没有记忆。它们单独处理每个输入,在输入和输入之间没有保存任何状态。举个例子:当你在阅读一个句子的时候,你需要记住之前的内容,我们才能动态的了解这个句子…

三、SqlSession的创建以及执行流程

简介 SqlSession接口提供了查询,插入,更新,删除方法,Mybatis中所有的数据库交互都由SqlSession来完成。SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法,它的底层封装了 JDBC 连接,可以用…

微服务链路追踪SkyWalking学习笔记

目录 1、skywalking是什么 1.2 链路追踪框架对比 1.3 性能对比 1.4 Skywalking主要功能特性 2、 SkyWalking 环境搭建部署 2.1 下载 SkyWalking 2.2 搭建SkyWalking OAP 服务 2.3 SkyWalking中三个概念 3、 SkyWalking 接入微服务 3.1 linux环境—通过jar包方式接入 …

SAP ADM100-2.5 系统启动:日志文件

本节将介绍SAP ABAP系统启动时最重要的log文件和Trce文件,以掌握通过使用系统启动log文件和trace文件分析系统问题。 1、记录系统启动过程 启动过程是一个特别重要的阶段,因此该过程将被操作系统、SAP系统、数据库记录。如果SAP系统没有启动,那么你将在log日志文件中发现相…

C#使用IronPython调用Python

一、前言以下摘自百度百科:IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。1.0 版于2006年9月5日发布。随后,在 2007 年,开发者决定改写架构&#…

音视频xxxx

文章目录前言编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量BMP 文件格式格式组成像素排列顺序RGB24格式像素数据…

Apache Solr 9.1-(三)集群模式下通过Http API操作Apache Solr

Apache Solr 9.1-(三)集群模式下通过Http API操作Apache Solr Solr是一个基于Apache Lucene的搜索服务器,Apache Lucene是开源的、基于Java的信息检索库,Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xf…

网络原理(TCP/IP)(3)

4)滑动窗口 1)咱们滑动窗口的效果就是说在我们尽可能地保证可靠性的情况下,尽可能的提高传输效率2)况且咱们进行发送滑动窗口的本质就是说进行批量的发送数据,咱们尽可能说是把等待ACK的时间总体进行缩短,咱们可以把等待一份ACK的时间变成等待…