如何实现线程安全?

简单描述一下线程安全问题:在程序并发执行的过程中,对于临界区的一些共享数据,可能同时会有多个线程对其进行修改,造成数据覆盖、脏读等一系列问题

如何实现线程安全?

首先想到的就是实现线程同步,让并发线程同步执行,保证共享的数据在同一时刻只能被一个线程使用。

同步方案

一、互斥实现同步(也可以理解为阻塞同步)

        互斥同步是一种最常见也是最主要的并发正确性保障手段。互斥是实现同步的一种手段,临界区、互斥量(Mutex)、信号量(Semaphore)都是常见的互斥实现方式。互斥是方法,同步是目的。

        在Java中使用了synchronized 和 Lock 来实现互斥同步,也就是通过加锁的方式来实现。

Java提供了Lock 的实现, 像ReentrantLock,它就像synchronized的超集,相比于synchronized增加了一些高级功能,主要由以下三项:等待可中断、可实现公平锁、可以绑定多个条件变量

(synchronized 和 ReentrantLock具体实现这里不做过多阐述)

二、非阻塞同步

        互斥同步面临的主要问题是进行线程阻塞和唤醒造成的线程上下文切换所带来的性能开销。因为采用加锁的方式来实现同步,当所资源被其他线程占有,当前线程获取不到锁的时候就会进入阻塞,释放CPU资源,当锁资源被释放时再抢占CPU资源,这样会导致线程上下文的切换(线程由用户态到内核态,内核态再到用户态),线程上下文切换是很消耗性能的。

        从解决问题的方式来看,互斥同步属于一种悲观的并发策略。

        非阻塞同步 是一种基于冲突检测的乐观并发策略,通俗地说就是不管风险,先进行操作,如果没有其他线程争用共享数据,那操作就直接成功了;如果共享数据的确被争用,产生了冲突,那么再进行其他的补偿措施,做常用的补偿措施就是不断地重试,直到共享数据不再存在竞争时。这种乐观的并发并发策略的实现不再需要把线程阻塞挂起,也称为“无锁”并发。

        这种“无锁并发”主要一种实现就是 CAS指令。

        在Java的Unsafe类中,提供了一系列CAS方法,compareAndSwapInt()、compareAndSwapLong()等。CAS指有三个参数:变量的内存地址(V)、旧的预期值(A)、准备设置的新值(B),CAS指令执行时,当V和A相等时,才会用B更新V中的值,否则就不执行更新,上述的过程是一个原子操作。

        CAS并不完美,它存在一个逻辑漏洞:ABA问题,如果一个变量在初次读取的时候是A,并且在准备赋值的时候也是A,就能保证在此期间没有其他线程对其进行修改吗,也有可能时 A -> B - > A这种情况。为了解决这个问题,Java 的J.U.C包中提供了带有标记的原子引用类AtomicStampedReference,它可以通过控制变量的版本信息来保证CAS的正确性

注:CAS是如何保证比较新旧值和更新值这两个操作的原子性的呢?

        CAS指令是基于硬件实现的原子指令,在操作系统层面,CAS还是会加锁的,通过加锁的方式锁定总线,避免其他CPU访问共享变量。(  还是加了“锁”  /(ㄒoㄒ)/~~)

无同步方案

要保证线程安全,也并非一定要进行同步,同步与线程安全两者并没有必然的联系。同步只是保障存在共享数据的争用时的线程安全,如果能保证一个方法本来就不实际共享数据,那么自然就不需要任何的同步措施。

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

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

相关文章

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了,但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料,本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息,帮人们解决更多问题。 …

移动端签名组件封装 借用插件 vue-esign

目录 需求实现讲解工具 - 图片旋转、base64 转换为 file 对象组件封装组件全局注册组件使用效果展示 需求 移动端需要实现手机横屏手写签名并上传签名图片功能。 实现讲解 vue-esign 插件文档地址 https://www.npmjs.com/package/vue-esign SignCanvas 组件封装原理&#xff1a…

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集)是一棵树,则称该树为图G的生成树(支撑树),简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E),每条边…

OceanBase Oracle 模式下系统视图权限导致的故障一例

在 Oracle 和 OB Oracle 租户下调用存储过程时,两者表现并不一致,导致获取到的 SQL 文本拼接不完整,影响到了业务侧的功能测试。本文将针对这个问题进行相关的测试和验证。 作者:赵黎明,爱可生 MySQL DBA 团队成员&…

C语言实现// 输入一个英文句子,以‘ . ’结束,统计句子中包含的字符个数

完整代码&#xff1a; // 输入一个英文句子&#xff0c;以‘ . ’结束&#xff0c;统计句子中包含的字符个数 #include<stdio.h>int main(){char ch;int length0;printf("请输入一个英文句子\n");while (chgetchar()!.){length;}printf("字符个数是&…

开源CasaOS云软件发现关键漏洞

近日&#xff0c;开源 CasaOS 个人云软件中发现的两个严重的安全漏洞。该漏洞一旦被攻击者成功利用&#xff0c;就可实现任意代码执行并接管易受攻击的系统。 这两个漏洞被追踪为CVE-2023-37265和CVE-2023-37266&#xff0c;CVSS评分均为9.8分。 发现这些漏洞的Sonar安全研究…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

linux安装达梦数据库(命令行安装)

安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id&#xff08;GID&#xff09; 12345&#xff1a; 指定的组名称 dinstall &#xff1a; 组名 2,创建安装用户dmdba [rootdmDMSe…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像&#xff0c;需要自己通过Dockerfile打包镜像&#xff0c;其实这也是为了开发者考虑&#xff0c;比如一些个性化功能&#xff0c;如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…

使用pdf.js预览pdf文件时如何兼容chrome66版本

最近在做一个需求&#xff0c;在PC端实现预览pdf文件的功能&#xff0c;但是要最低兼容chrome的66版本&#xff0c;因为公司用的chrome浏览器最低版本就是66版本。 现在下载PDF.js&#xff08;链接&#xff1a;https://mozilla.github.io/pdf.js/&#xff09; 下载下来的版本是…

PhotoShop字体加粗,PhotoShop字体添加边框,PhotoShop设置文字背景为图片

字体加粗 创建文字&#xff1a; 选中文字 &#xff08;用鼠标点一下&#xff09; 然后 转换为智能对象 输入合适的数值即可加粗字体 字体添加外边框 点击字体&#xff0c;点击右下角的fx 咋fx中选择描边 设置文字背景为图片 将文字放到刚刚图片所在的位置即可 。…

Vue 获取/设置指定组件高度

split-pane-left-area’是要获取的组件class&#xff0c;可以通过浏览器F12调试&#xff0c;在样式页面查看class信息 目的&#xff1a;将div的高度设置和split-pane-left-area 组件的高度一致 动态绑定style <div :style"{height: listHeight px}">获取元…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言&#xff0c;NXP官方uboot一定会支持不止 IMX6ULL芯片的代码&#xff0c;也不止支持 一种架构&#xff0c;还支持其他芯片或架构的源码文件。 为了方便阅读代码&#xff0c;vscode软件可…

2024年关于湖北省建筑安全员B证报考你需要了解

2024年关于湖北省建筑安全员B证报考你需要了解 建筑安全员B证指的是建设厅三类人员建安B证&#xff0c;很多人对于B证报考不是很了解&#xff0c;对于安全员B报考条件、报考流程、报考时间、报考地区等事项叙后尘告诉你们。 湖北建筑安全员B证报考条件-建安B证 1.你的二级建造师…

SpringCloud对服务内某个client进行单独配置

文章目录 问题解决过程问题解决 问题 我们的微服务项目用的是springCloud&#xff0c;某个微服务接口因为数据处理量大&#xff0c;出现了接口超时的情况&#xff0c;我们需要单独修改这一个feignClient的超时时间。 解决过程 一开始项目只是在application文件里面进行了全局…

计算机缺失pasmutility.dll怎么办,三步解决pasmutility.dll缺失

pasmutility.dll文件是windows系统中重要的dll文件&#xff0c;电脑一旦缺失dll文件就会导致电脑无法正常运行&#xff0c;同时还会唐初电脑缺失pasmutility.dll文件的提示窗口&#xff0c;非常影响电脑运行&#xff0c;那么出现计算机缺失pasmutility.dll该怎么办呢&#xff1…

随笔--ubuntu解压zip乱码问题

ubuntu解压zip乱码问题 安装 convmv sudo apt-get install convmv安装p7zip-full sudo apt install p7zip-full 解压乱码的文件夹 LANGC 7z x filename.zip -r -o/指定解压到的目标目录执行如下命令 convmv -f gbk -t utf8 -r --notest *

21.1 stm32使用LTDC驱动LCD--配置说明

本文讲解如何配置LTDC驱动LCD的参数配置&#xff0c;以及CubeMx参数配置说明 本文使用的是淘宝买的一块带电容触摸的液晶显示屏&#xff1a;5寸TFT液晶显示屏高清800*480免驱40P通用RGBIPS全视角彩屏GT911 说实话&#xff0c;价格还是相对挺便宜的&#xff0c;值得入手&#xf…

面试算法30:插入、删除和随机访问都是O(1)的容器

题目 设计一个数据结构&#xff0c;使如下3个操作的时间复杂度都是O&#xff08;1&#xff09;。 insert&#xff08;value&#xff09;&#xff1a;如果数据集中不包含一个数值&#xff0c;则把它添加到数据集中。remove&#xff08;value&#xff09;&#xff1a;如果数据集…

1.HTML-HTML解决中文乱码问题

题记 下面是html文件解决中文乱码的方法 方法一 在 HTML 文件的 <head> 标签中添加 <meta charset"UTF-8">&#xff0c;确保文件以 UTF-8 编码保存 <head> <meta charset"UTF-8"> <!-- 其他标签和内容 --> </head> --…