Java并发编程(下)

news2024/11/18 11:48:45

volatile的应用

- volatile修饰类属性(类变量和实例变量),synchronized修饰类方法、代码块,同时volatile在并发中是**不安全**的
- 作用:
  - 使共享变量在多线程间可见,如果一个字段被声明成volatile,Java线程内存模型会确保**所有线程**看到这个变量的值都是**一致**的
- 与volatile实现原理相关的CPU术语与说明
  - 内存屏障:是一类同步屏障指令,是CPU或者编译器在对内存随机访问的操作中的一个同步点,只有在此点之前的所有读写操作都执行后才可以执行此点之后的操作
  - 缓冲行:缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期
  - 原子操作:不可中断的一个或一系列操作,比如JDBC的事物就是一个原子操作
  - 填充:当一个容器中有很多数据时,数据读取就会变得拥挤、缓慢,所以此时我们对每个数据进行填充,使得一个容器中只能有三个数据甚至只有她自己,这时候数据读取就很快了
- 仅仅是volatile保证不了安全
- volatile的工作过程
  - 对声明了volatile的 变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据 写回到系统内存
  - 但,如果其他处理器缓存的值还是旧的,为了保证各个处理器的缓存是一致的,就会实现缓存一 致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当 处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状 态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存 里

synchronized的实现原理与应用

synchronized实现同步的基础:Java中的每一个对象都可以作为锁

synchronized是java的内置锁,也叫做内部锁或监视器锁,它的作用就是在同一时刻只有一个线程 能进入synchronized代码块

- 同步:需要排队
- 异步:不需要排队
- 关于同步的3种形式
  - 对于普通同步方法,锁是当前实例对象
  - 对于静态同步方法,锁是当前类的Class对象
  - 对于同步方法块,锁是Synchronized括号里配置的对象
- **实现原理**:JVM基于进入和退出Monitor对 象来实现方法同步和代码块同步(这是最底层的原理)。
  - 代码块同步是使用monitorenter 和monitorexit指令实现的
  - 方法同步是使用另外一种方式实现的,细节在JVM规范里并没有 详细说明。但是,方法的同步同样可以使用这两个指令来实现
- Java对象头

什么时候上锁归Java头对象决定(遇到Java头对象的锁标志),什么时候释放锁由monitor决定

- **锁的升级与对比**
- 升级过程:偏向锁-->轻量级锁-->重量级锁,同时,这个过程是**不可逆**的,当成为重量级锁时就永远停留在重量级锁
  - 偏向锁:
  - 引入:大多数情况下,锁不仅不存在多线程竞争,而且总是由**同一线程**多次获得
    - 在没有多线程竞争时,访问synchronized修饰的同步代码,会先使用偏向锁 ;
  - 适合于没有竞争
  - 轻量级锁:

  - 当其在访问资源时,若遇到资源被上锁,会每隔一段时间就去询问一下该资源是否仍然被占用(就是通过自旋)
    - 适合于少量并发
- 重量级锁:

  - 当其在访问资源时,若遇到资源被上锁,则会马上释放CPU,并且进入阻塞队列,此时所有的CPU资源都将用于正在占用资源的进程上,就能够更快的执行完成

  - 非常适合并发高的情况
- 锁的优缺点对比

原子操作的实现原理

- 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意 为“不可被中断的一个或一系列操作”。

- 相关术语

  - CPU流水线
    - 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。即可以同时为**多条指令的不同部分**进行工作,以提高各部件的利用率和指令的平均执行速度。
    - 流水线执行时会大大减少系统中电压切换次数,效率会大大的增高,但是会打破原有的执行顺序,导致我们需要进行**指令重排序**

- 处理器实现原子操作

  32位IA-32处理器使用基于对**缓存加锁**或**总线加锁**的方式来实现多处理器之间的原子操作

  - 使用**总线锁**保证原子性
    - 总线锁就是使用处理器提供的一个 **LOCK#**信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该 处理器可以独占共享内存。
    - 总线锁定把CPU和内存之间的通信锁住了,这使得锁定期间,其他处理器不能操作**其他内存地址**的数据,所以总线锁定的**开销**比较大
  - 使用**缓存锁**保证原子性
    - 在同一时刻,我们只需保证**对某个内存地址**的操作是原子性即可
    - 使用基础
      - 频繁使用的内存会缓存在处理器的L1、L2和L3高速缓存里,那么原子操作就可以直接在 处理器内部缓存中进行,并不需要声明总线锁
    - 两种种情况下不使用缓存锁定
      - 当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行 (cache line)时,则处理器会调用总线锁定
      - 有些处理器不支持缓存锁定。对于Intel 486和Pentium处理器,就算锁定的 内存区域在处理器的缓存行中也会调用总线锁定

- Java实现原子操作

  - 使用循环CAS实现原子操作

    - 自旋CAS实现的基本 思路就是循环进行CAS操作直到成功为止

  - CAS实现原子操作的三大问题

    CAS虽然很高效地解决了原子操作,但是CAS仍然存在三 大问题。**ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作**。

    - ABA问题
      - 由来
        - 如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它 的值没有发生变化,但是实际上却变化了
      - 解决思路
        - ABA问题的解决思路就是使用版本号
          - 在变量前面 追加上**版本号**,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A
    - 循环时间长开销大
      - 自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销
      - 解决:
        - pause指令
          - 第 一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间 取决于具体实现的版本,在一些处理器上延迟时间是零
          - 第二,它可以避免在退出循环的时候 因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空(CPU Pipeline Flush),从而 提高CPU的执行效率。
    - 只能保证一个共享变量的原子操作
      - 这时候需要使用**锁**
      - 有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作

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

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

相关文章

【Linux网络】应用层协议:HTTP 与 HTTPS

本篇博客整理了 TCP/IP 分层模型中应用层的 HTTP 协议和 HTTPS协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、协议是什么 1)结构化数据的传输 2)序列化和反序列化 补)网络版计算器 .1- 协议定制 .2- …

在window将Redis注册为服务

将redis注册为系统服务,开启自启动 安装服务 默认注册完之后会自动启动,在window中的服务看一下,如果启动类型为自动,状态是自动运行则启动完成。如果是手动,需要右键属性调整为自动,在点击启动&#xff0c…

LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器 RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage 。 可以在创建 AiService 期间指定 RetrievalAugmentor 的实例: Assistant assistant AiServices.builder(Assistant.cla…

Mysql-覆盖索引和前缀索引

一.SQL提示 SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句加入一些人为的提示来达到 二.覆盖索引 尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select* 知识小贴士: using index condition :查找…

chk是什么文件格式 chk文件怎么恢复正常 chkdsk文件损坏怎么修复

在使用电脑和移动存储设备时,有时我们会发现磁盘中出现了大量的chk文件。这些chk文件无法打开,也无法得知其原本内容。那么,这些chk文件是什么呢?又该如何将chk文件恢复正常呢? chk文件是什么? 在我们查看…

环境搭建-Docker搭建ClickHouse

Docker搭建ClickHouse 一、前言二、ClickHouse安装2.1 拉取镜像运行ClickHouse服务 三、测试安装3.1 进入clickhouse容器3.2 命令补充说明 四、测试连接五、设置CK的用户名密码 一、前言 本文使用的Docker使用Windows搭建,Linux版本的搭建方式一样。 Windows系统搭…

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期 页面和组件 组件:用Component装饰的代码称为自定义组件页面:Entry装饰的组件即页面的根节点 组件生命周期 aboutToAppear:在创建自定义组件的新实例后&#xf…

GPS定位系统(VUE框架)

源码下载:小宅博客网 博主之前写的《GPS定位系统(MVC框架)》版本,并没有做到前后端分离,不太适合多人协作开发,这边博主分享一个基于asp.net web api vue3的GPS定位系统框架,本框架继承了MVC框…

【Hot100】LeetCode—416. 分割等和子集

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接:416. 分割等和子集 1- 思路 理解为背包问题 思路: 能否将均分的子集理解为一个背包,比如对于 [1,5,11,5],判断能否凑齐背包为 11 的容量…

【shell】shell循环的几种方式

Shell循环的方式 for循环 for 变量名 in 值列表 do命令1命令2... done值列表情形: 值铺开变量数组 值铺开 变量 数组 while循环 while 条件判断 do命令1命令2... done条件判断情形 计算比较读取文本 计算比较 读取文本 until循环 until 条件 do命令1命令2... …

Imagination 面向大学推出 RISC-V 课程

Imagination Technologies发布了针对本科教学的 RISC-V 计算机架构完整课程,帮助学生了解处理器架构的关键元素,包括知识产权 (IP) 内核、修改 RISC-V 内核及其微架构。 该课程名为“RVfpga:理解计算机架构”,包含教学材料和实践…

【C++指南】类和对象(下)

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注

论文阅读_字节的语音生成模型_Seed-TTS

英文名称: Seed-TTS: A Family of High-Quality Versatile Speech Generation Models 中文名称: Seed-TTS:高质量多功能语音生成模型系列 链接: http://arxiv.org/abs/2406.02430v1 代码: https://github.com/BytedanceSpeech/seed-tts-eval (评测工具) 演示网站&am…

shell-awk命令详解

目录 一.概述 二.工作原理 三.工作流程 1.运行模式 2.运行流程 四.基本语法 1.命令格式 2.常用变量  五.变量类型 1.内建变量 2.内置变量 3.BEGIN END运算  4.awk高级用法 5.awk if语句 6.BEGIN END循环 一.概述 AWK是一种处理文本文件的语言,是一…

深入分析 Android ContentProvider (六)

文章目录 深入分析 Android ContentProvider (六)ContentProvider 的性能优化和实践案例(续)1. 性能优化技巧(续)1.6. 使用批量插入优化性能示例:批量插入实现 1.7. 使用 Projections 优化查询示例:使用 Pr…

Webpack 从入门到精通

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Webpack 简介 二、Webpack 的核心概念 三、Webpack 的安装与配置 安装 Node.js 安装 Webpack 初始…

【Linux C | 网络编程】进程池退出的实现详解(五)

上一篇中讲解了在进程池文件传输的过程如何实现零拷贝,具体的方法包括使用mmap,sendfile,splice等等。 【Linux C | 网络编程】进程池零拷贝传输的实现详解(四) 这篇内容主要讲解进程池如何退出。 1.进程池的简单退…

超越基础功能:项目进度管理工具深度评测

国内外主流的10款项目进度管理网站对比:PingCode、Worktile、滴答清单(TickTick)、Todoist、NarTick、Teambition、Monday.com、Asana、ClickUp、Trello。 在选择合适的项目进度管理工具时,许多项目经理面临着如何找到既能满足团队…

二十二、作业

目录 1.求代码结果 2.求代码结果 3.使用指针打印数组内容 4.字符串逆序 5.计算求和 6.打印水仙花数 7.打印菱形 8.喝汽水问题 1.求代码结果 输出为00345 2.求代码结果 任何一个变量/表达式,都有2个属性,值属性和类型属性 int a 3;…

Python及Jupyter-Notebook安装

来源: “码农不会写诗”公众号 链接:Python及Jupyter-Notebook安装 文章目录 01 Python安装1.1 下载安装包1.2 双击安装包,开始安装1.3 选择安装配置1.4 选择需要安装的Optional Feature,点击Next1.5 选择需要安装的Advanced Feat…