到底如何保证线程安全,总结得太好了!

article/2025/6/25 18:20:27

点击关注公众号,回复“2T”获取2TB学习资源!

互联网架构师后台回复 2T 有特别礼包

上一篇:IT界惊现文豪!华为领导及阿里P10遭吐槽

一、线程安全等级

之前的博客中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。

按照“线程安全”的安全程度由强到弱来排序,我们可以将java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。

d34200ff47673a59239197af4724d7db.png

1、不可变

在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。

2、绝对线程安全

绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到“不管运行时环境如何,调用者都不需要任何额外的同步措施”通常需要付出很大的代价。

3、相对线程安全

相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。另外,多线程系列面试题和答案全部整理好了,微信搜索互联网架构师,在后台发送:2T,可以在线阅读。

它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。

在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。

4、线程兼容

线程兼容就是我们通常意义上所讲的一个类不是线程安全的。

线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境下可以安全地使用。Java API中大部分的类都是属于线程兼容的。如与前面的Vector和HashTable相对应的集合类ArrayList和HashMap等。

5、线程对立

线程对立是指无论调用端是否采取了同步错误,都无法在多线程环境中并发使用的代码。由于java语言天生就具有多线程特性,线程对立这种排斥多线程的代码是很少出现的。

一个线程对立的例子是Thread类的supend()和resume()方法。如果有两个线程同时持有一个线程对象,一个尝试去中断线程,另一个尝试去恢复线程,如果并发进行的话,无论调用时是否进行了同步,目标线程都有死锁风险。正因此如此,这两个方法已经被废弃啦。

二、线程安全的实现方法

保证线程安全以是否需要同步手段分类,分为同步方案和无需同步方案。

4d32191eedfd2f640e7c5b95bf27acbf.png

1、互斥同步

互斥同步是最常见的一种并发正确性保障手段。同步是指在多线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用(同一时刻,只有一个线程在操作共享数据)。

而互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。因此,在这4个字里面,互斥是因,同步是果;互斥是方法,同步是目的。

在java中,最基本的互斥同步手段就是synchronized关键字,synchronized关键字编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码质量,这两个字节码指令都需要一个reference类型的参数来指明要锁定和解锁的对象。

此外,ReentrantLock也是通过互斥来实现同步。在基本用法上,ReentrantLock与synchronized很相似,他们都具备一样的线程重入特性。另外,多线程系列面试题和答案全部整理好了,微信搜索互联网架构师,在后台发送:2T,可以在线阅读。

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也成为阻塞同步。从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确地同步措施(例如加锁),那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都要进行加锁。

2、非阻塞同步

随着硬件指令集的发展,出现了基于冲突检测的乐观并发策略,通俗地说,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就再采用其他的补偿措施。(最常见的补偿错误就是不断地重试,直到成功为止),这种乐观的并发策略的许多实现都不需要把线程挂起,因此这种同步操作称为非阻塞同步。

非阻塞的实现CAS(compareandswap):CAS指令需要有3个操作数,分别是内存地址(在java中理解为变量的内存地址,用V表示)、旧的预期值(用A表示)和新值(用B表示)。

CAS指令执行时,CAS指令指令时,当且仅当V处的值符合旧预期值A时,处理器用B更新V处的值,否则它就不执行更新,但是无论是否更新了V处的值,都会返回V的旧值,上述的处理过程是一个原子操作。

CAS缺点:

ABA问题:因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。

ABA问题的解决思路就是使用版本号。在变量前面追加版本号,每次变量更新的时候把版本号加一,那么A-B-A就变成了1A-2B-3C。JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。

这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

3、无需同步方案

要保证线程安全,并不是一定就要进行同步,两者没有因果关系。同步只是保证共享数据争用时的正确性的手段,如果一个方法本来就不涉及共享数据,那它自然就无需任何同步操作去保证正确性,因此会有一些代码天生就是线程安全的。

1)可重入代码

可重入代码(ReentrantCode)也称为纯代码(Pure Code),可以在代码执行的任何时刻中断它,转而去执行另外一段代码,而在控制权返回后,原来的程序不会出现任何错误。所有的可重入代码都是线程安全的,但是并非所有的线程安全的代码都是可重入的。

可重入代码的特点是不依赖存储在堆上的数据和公用的系统资源、用到的状态量都是由参数中传入、不调用 非可重入的方法等。

(类比:synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时时可以再次得到该对象的锁)

2)线程本地存储

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

符合这种特点的应用并不少见,大部分使用消费队列的架构模式(如“生产者-消费者”模式)都会将产品的消费过程尽量在一个线程中消费完。

其中最重要的一个应用实例就是经典的Web交互模型中的“一个请求对应一个服务器线程(Thread-per-Request)”的处理方式,这种处理方式的广泛应用使得很多Web服务器应用都可以使用线程本地存储来解决线程安全问题。

原文链接:https://blog.csdn.net/qq_26545305/article/details/79516610/

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.心态崩了!税前2万4,到手1万4,年终奖扣税方式1月1日起施行~

2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.清华大学:2021 元宇宙研究报告!

6.为什么国内 996 干不过国外的 955呢?

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

2fa99d3dd71eb1c0aa8e566a9c1b12db.gif


http://chatgpt.dhexx.cn/article/ioZvSi6Z.shtml

相关文章

面试管:用了HTTPS就安全了吗?HTTPS 会被抓包吗?

点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看”来源:suo.im/61KOg3 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上…

解读「网络安全」SQL注入攻击

福利:[网络安全重磅福利:入门&进阶全套282G学习资源包免费分享 !] 我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪…

955.WLB 不加班公司名单新增 6 家公司,移出 1 家公司!

点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 No one can suffer for you, and no one takes your strong. 没有人能替你承受,也没有人拿得…

955,远程办公,这家公司要落地杭州了!

今年年初的时候,因为疫情严重,大部分公司都开启了在家远程办公的模式,所有工作都通过线上沟通和解决,得益于此,很多做企业通信协作的软件大涨了一波,美滋滋。远程这个关键词在百度指数一度涨了超过一倍。 远…

【服务器搭建个人网站】附:接入的服务商 以及 安全评估报告该如何填写?

前言 哈喽,大家好,我是木易巷! 关于公安备案的一些详细的细节没有分享出来,在公安备案期间要填写很多东西,其中比较难填写的就是接入的服务商和安全评估报告的填写。 这一篇给大家总结:公安备案接入服务商和…

[CTF]公司“DSFM-圣诞狂欢”杯安全技能赛writeup

1. Hello everyone 2048的小游戏,不用真正打通关,直接F12即可。 2. 数论 sm*p%q,要求出m,就可以得到flag。 python脚本: p int(0x9dfe6f4722f783589a955fe381d0308541dc2af910f525008b6265a294eff48846343c59,16)…

「网络安全」SQL注入攻击的真相

我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪分子。 SQL(结构化查询语言)是一种非常流行的与数据库通信的方式。虽然许多新数据…

「网络安全」SQL注入攻击

我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪分子。 SQL(结构化查询语言)是一种非常流行的与数据库通信的方式。虽然许多新数据库…

网络安全市场投资融资趋势报告

远程办公、隐私保护、风险合规,疫情之下的网络安全投 融资都有哪些关键词?| 2020 网络安全投融资趋势报告 毫无疑问,疫情是 2020 年最大的关键词之一。受疫情影响,全球经济形势不容乐观,网络 安全产业也受到了一定的波…

2022年我国网络安全市场融资情况汇总

远程办公、隐私保护、风险合规,疫情之下的网络安全投 融资都有哪些关键词?| 2020 网络安全投融资趋势报告 毫无疑问,疫情是 2020 年最大的关键词之一。受疫情影响,全球经济形势不容乐观,网络 安全产业也受到了一定的波…

少的有点可怜,955 不加班的公司名单...

估计每个人都想过,要是自己的工作能钱多事少离家近就好了,但现实很残酷,特别是在互联网行业,大小周是良心企业,单休 996 是常态,007 的公司数量也在增加,对于大多数“打工人”来说,如…

955 互联网公司白名单来了!

点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看”955,每天 9 点上班,下午 5 点下班,一周工作 5 天。相比 IT 行业盛行的…

人脸识别-实时轨迹

人脸识别-实时轨迹:是把人脸识别摄像机在地图上面标注点位;人脸识别摄像机抓拍识别到人脸后把人脸数据入库;查询点位关联的摄像机抓拍的人脸数据,在地图上将点位串联展示并实时刷新。 小细节 1.前提:人脸识别抓拍机,在添加客户人…

虹软java接摄像头_虹软人脸识别SDK在网络摄像头中的实际应用

目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容仅供参考。 市面…

海康SDK方式对接摄像头

1知识相关: OpenAPI:对外开放的接口 Http Methodhttp:请求的方法,常用的方法有GET/POST/PUT/DELETE等请求 Path:http请求路径,指域名/IP(端口号)之后的部分,如请求地址为"www.example.com/artemis/api"&…

人脸服务器如何与门禁系统对接,人脸识别门禁与自动门接线图

人脸识别门禁开锁流程是将VIP客户人脸图像库导入系统人脸库;当VIP客户接近高清摄像头,摄像头开始抓怕,并将所拍的人脸图像信息传给后台人脸识别服务器; 服务器收到摄像头传递过来的VIP客户图像,并将图像与预先导入的人脸库进行人脸比对。 若对…

调用远程摄像头进行人脸识别_工地如何实现安全帽检测/人脸识别?

安全生产一直是施工生产中很重要的一部分,只有保障了员工的安全,才能保证企业的利益。安全帽作为保护、防护的重要防范手段,一直是各大企业要求员工佩戴的,可还是发生了各种由于未佩戴安全帽导致的安全事故。 通过安装在工地施工现…

使用512KiB RAM基于单片机的实时摄像头人脸识别DNN论文解析

前言: 在读论文前可以先了解一下什么是GAP8(GAP8 是基于 RISC-V 和 PULP(并行超低功耗处理平台)开源平台的物联网应用处理器。它实现了智能设备的经济高效的开发、部署和自主操作,这些设备可以捕获、分析、分类并处理…

Springboot集成海康威视门禁设备,车牌识别摄像头,人脸设备

海康设备集成springboot 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 海康设备集成springboot前言一、海康SDK包根据下载的SKD包中的DEMO示例连接设备创建一个springboot项目将库文件放入根目录lib文件下&#…

java海康摄像头添加人脸_java及opencv实现调用本地摄像头、网络摄像头完成人脸检测、人脸收集、人脸识别、性别识别...

这几年人脸识别比较流行,各种应用场景都用到了人脸识别,如:无人店、火车站检票口、小区门禁、智慧展厅、某些银行网点等,这也是未来生活的一种趋势。我也是好奇想研究一下,百度google了一大堆资料,发现网上…