并发编程Part 2

news2024/11/20 15:29:40

1. JMM

问题:请你谈谈你对volatile的理解?

volitile 是 Java 虚拟机提供的一种轻量级的同步机制 ,三大特性:
  1. 保证可见性
  2. 不保证原子性
  3. 禁止指令重排

线程之间如何通信? 

  • 通信是指线程之间以如何来交换信息。
  • 一般线程之间的通信机制有两种:共享内存消息传递
  • Java的并发采用的是共享内存模型~

什么是JMM?  

  • Java内存模型即JMM(Java Memeory Model),它并不是真实存在的,而是Java中抽象出来的一个概念,用于多线程场景。
  • 共享内存模型 指的就是 Java内存模型 ( 简称 JMM)   { Java多线程内存模型 }
  • JMM 本身是一种抽象的概念,并不真实存在,它描述的是一组规则或者规范~
  • JMM描述了一组规则或规范,定义了一个线程对共享变量写入时对另一个线程是可见的,从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系
  • 关于JMM的一些同步的约定:
  1. 线程解锁前,必须把共享变量立刻刷回主存。
  2. 线程加锁前,必须读取主存中的最新值到工作内存中!
  3. 加锁和解锁必须是同一把锁
  • 在JMM中把多个线程间通信的共享内存称之为主内存{Main Memory},线程之间的共享变量存储在主内存(main memory)中,而在并发编程中每个线程都维护自己的一个本地内存{工作内存},每个线程都有一个私有的本地内存(Local Memory)其中保存的数据是从主内存中拷贝过来的数据副本,而JMM主要是控制本地内存和主内存之间的数据交互;
  • 本地内存是 JMM 的一个抽象概念,并不真实存在。
JMM内存模型
从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤:
  1. 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去
  2. 然后,线程B到主内存中去读取线程A之前已更新过的共享变量

下面通过示意图来说明线程之间的通信: 

总结:
  • 什么是Java内存模型:Java内存模型简称JMM,定义了一个线程对另一个线程可见。
  • 共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据的时候,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。

怎样保证线程B可以同步感知线程A修改了共享变量呢?

  1. 使用volatile关键字修饰变量
  2. 使用synchronized修饰修改变量的方法
  3. wait/notify
  4. while轮询

JMM内存模型底层八大原子操作: 

 

2. Volatile

volitile 是 Java 虚拟机提供的一种轻量级的同步机制 ,三大特性:
  1. 保证可见性
  2. 不保证原子性
  3. 禁止指令重排

使用volatile可以保证线程间共享变量的可见性,详细的说就是符合以下两个规则:

  • 线程对共享变量进行修改之后,要立刻回写到主内存。
  • 线程对共享变量读取的时候,要从主内存中读,而不是缓存。
  • 对于可见性,Java提供了volatile关键字来保证多线程共享变量可见性和禁止JVM指令重排,volatile提供happens-before{先行发生}的保证,volatile变量可以确保先行关系即写操作会发生在后续的读操作之前,确保一个线程的修改能对其它线程是可见的。当一个共享变量被volatile关键字修饰时,它会保证修改的值会立即被更新到主内存中,当有其它线程需要读取时,它会从主内存中读取最新的值。
  • {volatile关键字为变量的访问提供了一种免锁机制}
  • 但是,volatile并不能保证原子性例如用volatile修饰count变量,那么count++操作就不是原子性的{因为首先count++本身就不是原子性操作}
  • java.util.concurrent.atomic包下的原子类提供的atomic方法可以保证对其进行原子性操作,比如AtomicInteger类提供的getAndIncrement()方法会原子性的进行增量操作把当前值加1。

synchronized 和 volatile 的区别是什么?

  • synchronized 表示同一时间只有一个线程可以获取作用对象的锁,去进入同步代码块或者同步方法来执行代码,其他线程会被阻塞。
  • volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的 可见性;禁止指令重排序。
区别:
  • volatile 是变量修饰符,volatile关键字只能用于变量;synchronized 关键字可以修饰方法以及代码块
  • volatile 仅能实现变量的修改可见性,不能保证原子性而 synchronized 则可以保证对变量的修改操作的可见性和原子性{加锁和解锁}。
  • volatile 不会造成线程的阻塞;synchronized 会造成其它线程的阻塞。
  • volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。


3. 彻底玩转单例模式


4. 深入理解CAS


5. 原子引用


6. 各种锁的理解


6.1 公平锁、非公平锁


6.2 可重入锁


6.3 自旋锁


6.4 死锁

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

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

相关文章

HTML+CSS+JavaScript:随机点名案例

一、需求 1、点击开始按钮&#xff0c;姓名随机切换 2、点击结束按钮&#xff0c;姓名停止切换&#xff0c;此时显示的姓名即为被抽中者 3、同一个人不能被重复抽中 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE htm…

Scrum.org-ScrumMaster认证课-PSM培训

在敏捷学习的道路上继续前行&#xff0c;Leangoo领歌的PSM课程已经开启&#xff0c;认证全球认可&#xff0c;还不用续证&#xff0c;可以了解一下。 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交…

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…

Windows用户如何安装新版本cpolar内网穿透超详细教程

Windows用户如何安装新版本cpolar内网穿透 文章目录 Windows用户如何安装新版本cpolar内网穿透 在科学技术高度发达的今天&#xff0c;我们身边充斥着各种电子产品&#xff0c;这些电子产品不仅为我们的工作带来极大的便利&#xff0c;也让生活变得丰富多彩。我们可以使用便携的…

方法论揭秘|研发数字化转型,这家保险企业做对了什么?

7月27日&#xff0c;FCS 2023 第 7 届中国金融 CIO 峰会&#xff08;深圳站&#xff09;如期举行。大会以「洞见智慧金融」为主题&#xff0c;深度解读中国金融行业数字化转型现状&#xff0c;探讨金融行业信息化趋势、数字供应链金融服务、金融科技创新等问题&#xff0c;期望…

js:使用LetterAvatar通过canvas实现浏览器中生成字母头像

实现效果 LetterAvatar的原理就是利用了浏览器对象canvas 在线体验&#xff1a;https://mouday.github.io/tools/pages/letter-avatar/index.html LetterAvatar.js 完整代码 /** LetterAvatar* * Artur Heinze* Create Letter avatar based on Initials* based on https:/…

环形链表的进一步探究

茕茕白兔&#xff0c;东走西顾&#xff0c;衣不如新&#xff0c;人不如故 往期回顾&#xff1a; 数据结构——双向链表 数据结构——单链表 数据结构——顺序表 文章目录 如何判断一个链表是否为环形链表 环形链表的判断的深入探究 例1&#xff1a;沸羊羊追美羊羊 例…

多线程案例(3)

文章目录 多线程案例三三、 定时器 大家好&#xff0c;我是晓星航。今天为大家带来的是 多线程案例三 相关的讲解&#xff01;&#x1f600; 多线程案例三 三、 定时器 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就…

AgileBoot - 全栈项目启动

AgileBoot-Back-End: 基于Ruoyi做了大量重构优化的基础快速开发框架。采用Springboot Vue 3 Mybatis Plus 更面向对象的业务建模 面向生产的项目。&#xff08;非玩具项目&#xff09; 首先克隆代码&#xff0c;同是克隆前端和后端的代码。 前端代码启动&#xff1a; np…

机器学习---概述(二)

文章目录 1.模型评估1.1 分类模型评估1.2 回归模型评估 2. 拟合2.1 欠拟合2.2 过拟合2.3 适当拟合总结&#xff1a; 3.深度学习3.1层次&#xff08;Layers&#xff09;&#xff1a;3.2 神经元&#xff08;Neurons&#xff09;&#xff1a;3.3 总结 1.模型评估 模型评估是机器学…

【2种方法,jmeter用一个正则提取器提取多个值!】

jmeter中&#xff0c;用json提取器&#xff0c;一次提取多个值&#xff0c;这个很多人都会。但是&#xff0c;用正则提取器一次提取多个&#xff0c;是否可以呢&#xff1f; 肯定&#xff0c;很多人都自信满满的说&#xff0c;可以&#xff01;形如&#xff1a;token":&q…

MC0111配速MC0112白日梦Ⅰ

MC0111配速 难度&#xff1a; 白银 时间限制&#xff1a;1秒 占用内存&#xff1a;128M 小码哥参加了学校的定向越野比赛&#xff0c;赛完后&#xff0c;他踌躇满志地拿着自己的成绩单&#xff0c;看着一段段的数据&#xff0c;想算一下自己整场比赛的平均配速是多少。…

无涯教程-Lua - 嵌套if语句函数

在Lua编程中&#xff0c;您可以在另一个if or else if语句中使用一个if or else if语句。 nested if statements - 语法 嵌套if 语句的语法如下- if( boolean_expression 1) then--[ Executes when the boolean expression 1 is true --]if(boolean_expression 2)then--[ Ex…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio 通过Java实现和公众号的快速对接

目录 一、Cloud Studio是什么 1.1 Cloud Studio介绍 1.2 Cloud Studio功能特点 1.3 Cloud Studio的好处 二、实战案例 2.1 创建开发环境 2.2选择开发模板 2.3 代码编写 2.3.1 引入依赖包 2.3.2 创建Models配置类 2.3.3 创建测试类demo.java 三、使用总结 今天通过J…

数论—换元法

0x00 前言 换元法指将一个式子看做一个整体&#xff0c;进行整体运算&#xff0c;从而达到简化的目的。 0x01 例题&#xff1a; 1.求所有整数n&#xff0c;使得n1|n25 2.求所有整数n&#xff0c;使得n-2|n5n 同样使用n-2去换元即可。 3.求所有的整数n&#xff0c;使用n-1|…

c语言基础知识帮助理解(函数递归详解)

"从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚和一个小和尚。有一天老和尚对小和尚说:“从前有座山.山里有座庙&#xff0c;庙里有个老和尚和一个小和尚&#xff0c;有一天老和尚对小和尚说&#xff1a;“从前有座山.山里有座庙&#xff0c;庙里有个老和尚…

uniapp返回

// 监听返回事件onNavigationBarButtonTap() {uni.showModal({title: 提示,content: 确定要返回吗&#xff1f;,success: (res) > {if (res.confirm) {uni.navigateBack({delta: 2})}}})},

Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全

一、主要安全功能 1、每时每刻在各端口对全部应用进行分类 • 将 App-ID 用于工业协议和应用&#xff0c;例如 Modbus、 DNP3、IEC 60870-5-104、Siemens S7、OSIsoft PI 等。 • 不论采用何种端口、SSL/SSH 加密或者其他规避技术&#xff0c;都会识别应用。 • 使用…

opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作&#xff0c;用于在图像上应用滤波器或卷积核&#xff0c;从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中&#xff0c;图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动&#xff0c;对每个局部区…

智慧消防解决方案

智慧消防解决方案引入了物联网云平台、云计算中心等创新技术&#xff0c;实现对消防物联网数据的实时采集、传输和分析处理。通过智能感知设备与云平台的紧密结合&#xff0c;该解决方案利用先进的物联网技术、移动互联网和云计算等先进技术手段&#xff0c;实现火灾报警信号的…