并发编程 原子性 可见性 有序性

news2024/11/24 15:56:48

在这里插入图片描述

并发编程的三个重要特性

原子性所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。
可见性可见性是指,当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值。
有序性所谓有序性是指程序代码在执行过程中的先后顺序,由于Java在编译器以及运行期的优化,导致了代码的执行顺序未必就是开发者编写代码时的顺序。

JMM如何保证三大特性

JMM与原子性

原子性操作非原子
对基本数据类型的变量读取赋值操作都是原子性的多个原子性的操作在一起就不再是原子性操作
对引用类型的变量读取和赋值的操作也是原子性的y++
get iy=x
i+1z=z+1
set ix=10
Java如何保证原子性性
JMM只保证了基本读取和赋值的原子性操作,其他的均不保证
使用关键字synchronized
使用JUC中的lock
如果想要使得int等类型自增操作具备原子性,可以使用JUC包下的原子封装类型java.util.concurrent.atomic.*

JMM与可见性

在多线程的环境下,如果某个线程首次读取共享变量,则首先到主内存中获取该变量,然后存入工作内存中,以后只需要在工作内存中读取该变量即可。
同样如果对该变量执行了修改的操作,则先将新值写入工作内存中,然后再刷新至主内存中。但是什么时候最新的值会被刷新至主内存中是不太确定的。
Java提供了以下三种方式来保证可见性
使用关键字volatile当一个变量被volatile关键字修饰时,对于共享资源的读操作会直接在主内存中进行(当然也会缓存到工作内存中,当其他线程对该共享资源进行了修改,则会导致当前线程在工作内存中的共享资源失效,所以必须从主内存中再次获取),对于共享资源的写操作当然是先要修改工作内存,但是修改结束后会立刻将其刷新到主内存中
1)Reader线程从主内存中获取init_value的值为0,并且将其缓存到本地工作内存中。
2)Updater线程将init_value的值在本地工作内存中修改为1,然后立即刷新至主内存中。
3)Reader线程在本地工作内存中的init_value失效(反映到硬件上就是CPU的L1或者L2的Cache Line失效)。
4)由于Reader线程工作内存中的init_value失效,因此需要到主内存中重新读取init_value的值。
通过synchronized关键字能够保证可见性synchronized关键字能够保证同一时刻只有一个线程获得锁,然后执行同步方法,并且还会确保在锁释放之前,会将对变量的修改刷新到主内存当中。
通过JUC提供的显式锁Lock也能够保证可见性Lock的lock方法能够保证在同一时刻只有一个线程获得锁然后执行同步方法,并且会确保在锁释放(Lock的unlock方法)之前会将对变量的修改刷新到主内存当中。

JMM与有序性

在Java的内存模型中,允许编译器和处理器对指令进行重排序,在单线程的情况下,重排序并不会引起什么问题
但是在多线程的情况下,重排序会影响到程序的正确运行
Java提供了三种保证有序性的方式
使用volatile关键字来保证有序性volatile关键字对顺序性的保证就比较霸道一点,直接禁止JVM和处理器对volatile关键字修饰的指令重排序,但是对于volatile前后无依赖关系的指令则可以随便怎么排序
使用synchronized关键字来保证有序性同步代码在执行的时候与在单线程情况下一样自然能够保证顺序性(最终结果的顺序性
使用显式锁Lock来保证有序性同步代码在执行的时候与在单线程情况下一样自然能够保证顺序性(最终结果的顺序性

-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

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

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

相关文章

chatgpt赋能python:Python中如何合并列表-详细教程

Python中如何合并列表 - 详细教程 在Python编程中,有时候需要把两个或多个列表合并成一个单一的列表,以便更好地进行数据处理。Python中有几种方法可以实现列表合并,本文将介绍其中的三种方法。 1. 使用“”符号 最常见的方法是使用“”符…

InsCode AI 创作助手:源于 CSDN 的 AI 创作助手,不一样的创作体验

文章目录 📋前言🎯AIGC 时代的产物🎯InsCode AI 创作助手体验🎯一些感受和建议🧩感受🧩建议(个人看法) 📝最后 📋前言 是的没错,CSDN AI 写作助手…

Vue组件化开发

1. 认识组件 1.1 基础示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

STM32CubeIDE HAL STM32f103C8T6 系列教程1 --- 板载PC13LED闪烁 引言硬件关于开发板[^2]控制器内置存储器原理图 硬件连线硬件连接表硬件连线图 软件STM32CubeIDE下载及安装Stm32CubeIDE设置补全快捷键和主题新建一个工程选择开发板核心芯片型号设置工程相关参数STM32CubeMX…

最热门高效的Node.JS开源第三方开发库和特点(持续更新......)

目录 1. Express 2. Socket.io 3. Mongoose 4. Passport 5. Async 6. PM2 7. Nodemailer 8. Request 9. Cheerio 10. Lodash 11. Bluebird 12. Winston 13. Socket.io-client 14. Node-sass 15. Moment 16. Gulp 17. Grunt 18. Chai 19. Sinon 20. Nodemon…

Java线程之间如何通信的,有哪些方式?

线程之间的通信方式主要有以下几种&#xff1a; 共享变量&#xff1a;线程之间可以通过共享变量来进行通信。不同的线程可以共享同一个变量&#xff0c;并在变量上进行读写操作。需要注意的是&#xff0c;共享变量可能会引发线程安全问题&#xff0c;需要通过同步机制来确保线程…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

chatgpt赋能python:Python中如何对文本进行修改

Python中如何对文本进行修改 在Python编程中&#xff0c;涉及到文本操作的场合并不少见。我们可能需要读取文件、解析HTML网页、处理字符串等等。而在对文本进行操作的过程中&#xff0c;修改文本是非常常见的需求。本文将介绍Python中对文本进行修改的几种基本方法。 1. 字符…

实验篇(7.2) 04. 映射内网服务器到公网IP ❀ 远程访问

【简介】由于服务器的IP是内网地址&#xff0c;所以无法从公网直接访问服务器。要想远程访问服务器&#xff0c;最简单的办法就是将服务器映射到公网IP&#xff0c;然后通过公网IP加端口号的方式进行访问。 实验要求与环境 OldMei集团深圳总部部署了一台服务器&#xff0c;用来…

微服务实战项目-学成在线-内容管理模块(有项目实战实现)

内容管理模块 1 模块需求分析 1.1 什么是需求分析 在百度百科中对需求分析的定义如下&#xff1a; 需求分析也称为软件需求分析、系统需求分析或需求分析工程等&#xff0c;是开发人员经过深入细致的调研和分析&#xff0c;准确理解用户和项目的功能、性能、可靠性等具体要…

Golang每日一练(leetDay0081) 基本计算器I\II Basic Calculator

目录 224. 基本计算器 Basic Calculator &#x1f31f;&#x1f31f;&#x1f31f; 227. 基本计算器 II Basic Calculator &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C…

OpenAI API最新速查表;轻松制作数字分身;8个ChatGPT「作弊」策略;微软提示工程官方教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; The OpenAI API in Python 最新速查表 ShowMeAI知识星球资源编码&#xff1a;R102 大语言模型的发展&#xff0c;正在推动 OpenAI API…

chatgpt赋能python:Python中的宏定义及其使用

Python中的宏定义及其使用 Python是一种高级编程语言&#xff0c;其灵活性和可读性深受程序员的喜爱。Python中的宏定义是一种强大且实用的编程特性&#xff0c;在编写复杂程序时可以提高程序的可重用性和可扩展性。 什么是宏&#xff1f; 在计算机编程中&#xff0c;宏是一…

chatgpt赋能python:Python中怎么安装包:完整指南

Python中怎么安装包&#xff1a;完整指南 Python是一种高级编程语言&#xff0c;被广泛应用于数据科学、Web开发、自动化、AI和机器学习等领域。Python的强大功能得益于它的包管理系统&#xff0c;这意味着开发者可以在自己的项目中使用已经编写好的代码。在本文中&#xff0c…

IaaS、PaaS、SaaS、DaaS的区别

IasS - 基础设施即服务 IaaS是Infrastructure as a server的缩写&#xff0c;意思是基础设施即服务。云端公司把IT环境的基础设施建设好&#xff0c;然后直接对外出租硬件服务器或者虚拟机。消费者可以利用所有计算基础设施&#xff0c;包括处理CPU、内存、存储、网络和其它基…

电容笔哪个牌子好用?苹果平板笔推荐

随着国内消费水平的上升&#xff0c;大家开始注重环保。开始使用起了无纸化书写&#xff0c;而无纸化的书写最离不开电容笔。但市面上的电容笔品牌大同小异&#xff0c;而每个人的使用体验都不同。所以今天给大家科普一下挑选电容笔的注意事项和推荐几款市面上好用的电容笔&…

116.移除指定元素 removeSpecifyElement

文章目录 题目描述解题思路代码详解运行截图 题目描述 题目链接 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输…

Rust每日一练(Leetday0015) 字符串相乘、通配符匹配、跳跃游戏II

目录 43. 字符串相乘 Multiply Strings &#x1f31f;&#x1f31f; 44. 通配符匹配 Wildcard Matching &#x1f31f;&#x1f31f;&#x1f31f; 45. 跳跃游戏 II Jump Game II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一…

chatgpt赋能python:Python中如何创建矩阵

Python中如何创建矩阵 矩阵&#xff08;matrix&#xff09;是线性代数中的重要概念&#xff0c;它在数学、物理、计算机科学等领域中都有着广泛应用。在Python编程中&#xff0c;我们也经常需要创建矩阵来进行各种数学计算&#xff0c;例如矩阵乘法、逆矩阵求解等。那么&#…

chatgpt赋能python:Python中如何去掉重复项

Python中如何去掉重复项 在Python的编程中&#xff0c;常常会遇到需要去掉重复项的情况。重复项的存在会极大地影响程序的效率和准确性。在本篇文章中&#xff0c;我们将讨论Python中如何去掉重复项&#xff0c;包括使用set()函数、使用列表推导式和使用字典的方法。这些方法都…