线程安全有哪些实现思路?

1.互斥同步

synchronized 和 ReentrantLock。

2.非阻塞同步

互斥同步最主要的问题就是线程阻塞和唤醒所带来的性能问题,因此这种同步也称为阻塞同步。

互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。

  • CAS

随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略: 先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。

乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是: 比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。

  • AtomicInteger

J.U.C 包里面的整数原子类 AtomicInteger,其中的 compareAndSet() 和 getAndIncrement() 等方法都使用了 Unsafe 类的 CAS 操作。

AtomicInteger是Java中的一个原子操作类,它位于java.util.concurrent.atomic包下。AtomicInteger提供了一种线程安全的方式来操作int值,它可以在多线程环境下保证对int值的原子性操作。

AtomicInteger的主要作用是提供原子操作来进行Integer的使用,适合高并发情况下的使用。在多线程环境下,当有多个线程同时执行AtomicInteger实例包含的方法时,具有排它性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断。

AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作。它提供了一些方法来进行原子操作,如incrementAndGet()、getAndIncrement()、getAndAdd()等。这些方法可以保证在多线程环境下对int值的原子性操作,避免了使用同步锁等机制带来的性能开销。

总的来说,AtomicInteger是一种高效的线程安全操作类,适用于需要高并发操作对int值进行原子性操作的场景。

3.无同步方案

要保证线程安全,并不是一定就要进行同步。如果一个方法本来就不涉及共享数据,那它自然就无须任何同步措施去保证正确性。

  • 栈封闭

多个线程访问同一个方法的局部变量时,不会出现线程安全问题,因为局部变量存储在虚拟机栈中,属于线程私有的。

"栈封闭"这个概念在计算机科学中通常是指一个栈(数据结构)在某一时刻达到了稳定状态,即在该时刻之后,栈中的元素不会因为新的元素入栈而发生改变。

更具体地说,如果一个栈在某一时刻之后不再有新的元素入栈,那么这个栈就被称为在该时刻是封闭的。封闭栈的顶部元素(最后入栈的元素)总是可用的,因为它没有被其他元素覆盖。

栈封闭的概念通常在计算机科学和编程中使用,特别是在处理递归和深度优先搜索(DFS)等问题时。例如,在解析复杂的语法结构(如编程语言的解析)时,可以使用栈来存储解析过程中的状态,如果在这个过程中栈始终保持封闭状态,那么就可以避免出现错误。

请注意,这个概念并不是数学意义上的封闭,而是指一种特定的计算机科学现象。

  • 线程本地存储(Thread Local Storage)

如果一段代码中所需要的数据必须与其他代码共享,那就看看这些共享数据的代码是否能保证在同一个线程中执行。如果能保证,我们就可以把共享数据的可见范围限制在同一个线程之内,这样,无须同步也能保证线程之间不出现数据争用的问题。

线程本地存储(Thread-local Storage,TLS)是一种机制,它为每个线程提供独立的存储空间。这样,每个线程都可以在其自己的存储空间中存储数据,而不会与其他线程的数据冲突。这可以避免并发问题,使得每个线程都可以安全地访问其自己的数据。

在实现上,线程本地存储通常是通过使用一个映射表来实现的,表中每个线程ID映射到一个特定的数据块。当线程需要访问其本地数据时,它首先需要查找映射表,找到对应的数据块,然后在这个数据块中进行操作。

这种机制对于需要为每个线程提供独立数据的情况非常有用,例如在多线程编程中,当多个线程需要访问共享资源(例如数据库)时,使用线程本地存储可以避免数据冲突和并发问题。

 

 

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

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

相关文章

Python 3 读取配置文件

1 配置文件内容 config.ini # 登录信息 [login] url https://www.baidu.com username wangxiaoli userpass admin123# 天气信息 [weather] # 是否下雨 rain True # 降雨量 rainvalue 5.05 # 是否下雪 snow False # 降雪量 snowvalue 8.32# SQLServer [sqlserver] user …

HashMap底层实现原理详解

一、HashMap重要知识点 HashMap是无序且不安全的数据结构。HashMap 是以key–value对的形式存储的,key值是唯一的(可以为null),一个key只能对应着一个value,但是value是可以重复的。HashMap 如果再次添加相同的key值&…

管理Windows资产新方式:SSH协议

配置默认shell,需要管理员权限运行powershell执行下面命令: New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -F…

安卓小程序与编译抓包

APK小程序渗透测试 查找bp的证书 在浏览器中打开bp代理,然后在网页中搜索hppps://burp 点击高级——接受风险并继续 拿到证书 将浏览器信任证书 打开设置 搜索证书——查看证书 点击导入——导入证书 证书验证成功后,访问网页(吾爱破解&a…

iOS 开发高效率工具包:10 大必备工具

​ 作为 iOS 开发人员,拥有合适的工具可以极大地提高您的工作效率和工作质量。无论您是刚刚起步还是已经开发 iOS 应用程序多年,以下是每个 iOS 开发人员都应该了解的 10 大必备工具。 让我们开始 Xcode Xcode 是用于 iOS 开发的官方 IDE(…

【Windows】内网穿透实现hMailServer远程发送邮件

目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网…

Python 进阶(十二):随机数(random 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入random库2. 常用随机数函数2.1 生成随机浮点数2.2 生成随机整数2.3 从序列中随机选择2.4 随机打乱序列3. 设置随机数种子4. 应用实例4.1 游戏开发4.2 数据分析4.3 加密与安全4.4 模拟实验

一维数组一级指针相关知识

一维数组名: int array[5] {1,2,3,4,5};1、array:表示数组的名字,同时也是数组的首地址;2、array[1]:取数组第一个元素的值(特别注意:数组的下标是从0开始的),等价于*(array1);3、&array[…

【方案】智慧林业:如何基于EasyCVR视频能力搭建智能林业监控系统

随着人类进程的发展。城市化范围的扩大,森林覆盖率越来越低,为保障地球环境,保护人类生存的净土,森林的保护与监管迫在眉睫。TSINGSEE青犀智慧林业智能视频监控系统方案的设计,旨在利用现代科技手段提高林业管理的效率…

设计模式---第二篇

系列文章目录 文章目录 系列文章目录前言一、抽象工厂模式二、装饰器模式是什么三、代理模式和装饰器模式有什么区别前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

双向ESD保护 汽车级TVS二极管 ESD9B3.3ST5G工作原理、特性参数、封装形式

什么是汽车级TVS二极管? TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护,防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中,由于车辆启…

20、LED点阵屏

LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色:单色、双色、全彩 按像素…

Mybatis批处理数据插入(rewriteBatchedStatements参数)

一、rewriteBatchedStatements参数 1、MySQL JDBC驱动在默认情况下会无视executeBatch()【也就是说JDBC默认情况下,会将你的语句分拆成单个,一条一条发给数据库执行,数据量小时感知不大,1w或10w以上差距越来越大】 2、MySQL的JDBC…

Python函数专题(下)侯小啾python领航班系列(十三)】

Python函数专题(下)侯小啾python领航班系列(十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

「Qt Widget中文示例指南」如何创建一个计算器?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何使用…

冒个泡!OceanBase亮相 2023 新加坡金融科技节

近日,OceanBase 亮相 Singapore Fintech Festival 2023(2023 新加坡金融科技节)!本届新加坡金融科技节于 2023 年 11 月 15 日至 17 日在新加坡博览展览中心举行,展会期间,OceanBase 得到了众多金融科技机构…

MySQL实现(免密登录)

简介: MySQL免密登录是一种允许用户在没有输入密码的情况下直接登录到MySQL服务器的配置。这通常是通过在登录时跳过密码验证来实现的。 1、修改MySQL的配置文件 使用vi /etc/my.cnf,添加到【mysqld】后面 skip-grant-tables #配置项告诉mysql跳过权限验证&#…

程序员养生之道:延寿不忘初心——延寿必备

文章目录 每日一句正能量前言如何养生饮食篇运动篇休息篇后记 每日一句正能量 现代社会已不是大鱼吃小鱼的年代,而是快鱼吃慢鱼的年代。 前言 在IT行业中,程序员是一个重要的职业群体。由于长时间的繁重编程工作,程序员们常常忽略了身体健康…

JPEG 协议中英文对照

机器翻译 已上传csdn 链接: jpeg

Chrome 拓展开发系列:什么是 Chrome 拓展?

文章目录 Chrome 拓展(Chrome Extension)是什么为什么使用 Chrome 拓展?个性化浏览体验提高工作效率改善隐私和安全创新新功能 发展历史2009 年:初版发布2010 年:稳步增长2013 年:Chrome App 和扩展合并201…