了解线程安全

前言

         在Java中,多线程编程是一种常见的并发执行技术,它允许程序同时执行多个任务。然而,当多个线程访问共享资源时,可能会出现数据不一致和不可预测的行为,这种情况被称为线程安全问题。本文将介绍Java中jvm内存模型,线程安全概念、问题以及解决方案。

一:JVM内存模型

        Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中。

如何保证多个线程操作主内存的数据完整性是一个难题,Java内存模型也规定了工作内存与主内存之间交互的协议,首先是定义了8种原子操作:

  • (1) lock:将主内存中的变量锁定,为一个线程所独占

  • (2) unclock:将lock加的锁定解除,此时其它的线程可以有机会访问此变量

  • (3) read:将主内存中的变量值读到工作内存当中

  • (4) load:将read读取的值保存到工作内存中的变量副本中。

  • (5) use:将值传递给线程的代码执行引擎

  • (6) assign:将执行引擎处理返回的值重新赋值给变量副本

  • (7) store:将变量副本的值存储到主内存中。

  • (8) write:将store存储的值写入到主内存的共享变量当中。

JVM内存模型,要解决两个主要的问题:可见性和有序性。

由于JVM内存模型的规定,每个线程工作内存保存的是共享变量的副本,所有多个线程之间是不能互相传递数据通信的,它们之间的沟通只能通过共享变量来进行。如果一个线程修改了这个共享变量,那么其他线程应该能够看到这个被修改后的值,这就是多线程的可见性问题,java中volatile解决了可见性问题,禁止指令重排序优化,保证代码执行的有序性。

二:线程安全概念

        线程安全是指代码在多线程环境中能够正确执行,不会因为多线程的介入而产生不可预期的结果(运行出错或者数据不一致)。简而言之,当多个线程并发操作某类的某个方法,(在该方法内部)来修改这个类的某个成员变量的值,不会出错,则我们就说,该的这个方法是线程安全的。生活当中的例子,演唱会,高铁票,秒杀等等场景,不会出现超卖情况。


线程安全主要关注问题:

  • 竞态条件

竞态条件发生在多个线程访问同一资源,并且至少有一个线程在修改这个资源时。如果最终结果依赖于线程执行的顺序,那么就会发生竞态条件。

  • 数据竞争

数据竞争是指多个线程同时访问和修改共享数据,导致数据的最终结果不确定。数据竞争通常发生在不适当地访问共享数据的情况下,例如没有正确使用同步机制进行保护。

  • 死锁

死锁是指多个线程相互等待对方释放资源而无法继续执行的状态。死锁通常发生在多个线程同时持有某些资源,并且互相等待对方释放资源的情况下。

  • 互斥锁

互斥锁是一种用于保护共享资源的同步机制。在多线程环境下,互斥锁可以确保同一时间只有一个线程可以访问共享资源,其他线程需要等待互斥释放后才能继续执行。


二:线程安全解决方案

无非是要控制多个线程对某个资源的有序访问或修改。

单机情况下:

  • 同步(Synchronization)

Java提供了synchronized关键字来控制对共享资源的访问。当一个线程访问一个对象的synchronized方法或代码块时,其他线程将无法访问该对象的任何其他synchronized方法或代码块。

  • 锁(Locks)

Java的java.util.concurrent.locks包提供了更灵活的锁机制,如ReentrantLock。这些锁提供了与synchronized关键字类似的功能,但提供了更多的控制。

分布式情况下(分布式锁):

  • 数据库分布式锁
  • zookeeper分布式锁
  • redis分布式锁等

小结:

        多线程安全是Java编程中的一个重要议题。通过理解线程安全的概念和问题,以及掌握不同的线程安全解决方案,可以有效地编写出既高效又安全的并发程序。记住,正确的并发设计和实现可以显著提高程序的性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode Comment Translate 反应慢 加载中...

Comment Translate 版本:v2.3.3 你是不是疑惑切换了 Bing 源也无法使用还是加载中… 那么可能你切换Bing后没重启vscode 下面是切换成功后的插件日志,一定要重启vscode,只是禁用和启用插件不行的,另外google是没用的,用…

ES文档:文档操作_doc(7.9.2)

用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。 ElasticSearch文档的操作; 添加文档 新建一个索引 goboy-blog,如果添加文档索引不存在则会创…

人保财险(外包)面试分享

前言: 这是本月面的第三家公司,太难了兄弟们,外包都不好找了,临近年底,金九银十已经错过了,金三银四虽然存在,但按照这几年的行情,金九银十和金三银四其实已经是不复存在了&#xf…

机器视觉基础—双目相机

机器视觉基础—双目相机与立体视觉 双目相机概念与测量原理 我们多视几何的基础就在于是需要不同的相机拍摄的同一个物体的视场是由重合的区域的。通过下面的这种几何模型的目的是要得到估计物体的长度,或者说是离这个相机的距离。(深度信息&#xff09…

C++ | Leetcode C++题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {int m matrix.size(), n matrix[0].size();// 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大的…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

安卓智能指针sp、wp、RefBase浅析

目录 前言一、RefBase1.1 引用计数机制1.2 设计目的1.3 主要方法1.4 如何使用1.5 小结 二、sp和wp2.1 引用计数机制2.2 设计目的2.3 主要方法2.3.1 sp2.3.2 wp 2.4 如何使用2.5 小结 四、参考链接 前言 安卓底层binder中&#xff0c;为什么 IInterface要继承自RefBase &#x…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍&#xff0c;这一篇就来跑跑 Dolphins 模型&#xff0c;本篇会记录&#xff0c;跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里&#xff0c;并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …

CentOS 7 更换软件仓库

CentOS 7 于2024年6月30日停止维护&#xff0c;官方仓库已经没有软件了&#xff0c;想要继续使用 &#xff0c;需要更换软件仓库&#xff0c;这里更换到阿里云的软件仓库 https://developer.aliyun.com/mirror/ 查看目前可用的软件数量 yum repolist 更换软件仓库&#xff1a…

初学者指南:用例图——开启您的软件工程之旅

目录 背景&#xff1a; 基本组成&#xff1a; 关联&#xff08;Assciation&#xff09;&#xff1a; 包含&#xff08;Include&#xff09;&#xff1a; 扩展&#xff08;Extend&#xff09;&#xff1a; 泛化&#xff08;Inheritance&#xff09;&#xff1a; 完整银行…

单位正交矢量的参数化,用于特征矢量对厄尔米特矩阵对角化使用

​ 首先α β 在0-pi/2内&#xff0c;这样就可以取值0-1&#xff0c;满足了单位化的要求 每个向量的模由α和β定义&#xff0c;αβ定义模的时候只限制在0–pi/2&#xff0c;由画图可知不可正交 为了验证矩阵 U 3 \boldsymbol{U}_3 U3​ 的第一列和第二列是否正交&#xff…

Spring Security 框架篇-深入了解 Spring Security 的授权核心功能(RBAC 权限模型、自定义异常处理器、校验权限方法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 权限系统 1.1 引入 1.2 RBAC 权限模型 1.3 数据库设计 2.0 Spring Security 核心功能-授权 2.1 思路分析 2.2 编写 SQL 语句 2.3 将用户权限进行封装 2.4 获取用户…

使用 API 和离线库查询 IP 地址方法详解

目录 一、IP 地址查询能获取哪些信息1.地理位置信息2.网络信息3.网络类型 二、IP 地址查询方法&#xff0c;附代码1.在线查询 IP 地址方法2.使用 API 进行 IP 地址查询3.使用离线库进行 IP 地址查询 互联网监管部门要求公开 IP 归属地&#xff0c;引起了很大热度&#xff0c;但…

微服务day02

教学文档&#xff1a; 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行容器 搜索Nginx镜像&#xff1a;在 www.hub.docker.com 网站进行查询 拉取镜像&#xff1a; docker pull ngin…

一个小程序如何对接多个收款账户?

背景 我又来了&#xff0c;之前对接过网约巴士系统 网约巴士旅游专线平台搭建历程&#xff0c;运营了两年多了。在运营中完善、在完善中学习&#xff0c;一直是不变的真理。有一句话说得好&#xff1a;先做一个垃圾、用起来再说。 今天又需要升级了&#xff0c;需求是&#…

基于航片的玉米异常情况识别赛题正在报名中 | CCF BDCI进行时

一年一度的行业盛事2024 CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;又在激烈进行中啦 多个赛题等你挑战&#xff0c;还没有报名的伙伴们抓紧时间咯&#xff0c;叫上你伙伴练起来吧&#xff01; 2024 CCF大数据与计算智能大赛 CCF大数据与计算智能大…

面试题:Spring(一)

1. Spring框架中bean是单例么&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。 2. Spring框架中的…

Android View事件分发

目录 1.什么是View事件分发&#xff1f; 2.事件的类型 3.事件的发生 4.事件分发的方法 4.1 dispatchTouchEvent() 4.2 onTouchEvent() 4.3 onInterceptTouchEvent() 5.滑动冲突 5.1 外部拦截法 5.2内部拦截法 6.onTouch的执行高于onClick 7. onTouch()和onTouchEve…

uniapp 实现瀑布流

效果演示 组件下载 瀑布流布局-waterfall - DCloud 插件市场

6.qsqlquerymodel源码分析

目录 继承关系入口浅析qsqlquery刷新数据 扩展列或者移除列以及取别名读取数据与增减行读取数据 下一章节&#xff1a;如何使用qsqlquerymodel 与 qtableview实现自定义表格 继承关系 qsqlquerymodel 继承与qabstracttablemodel 入口 负责填充数据 void QSqlQueryModel::s…