如何理解什么是线程安全?

 什么是线程安全

线程安全在多线程编程时是一个比较重要的概念,我们下先来看下维基百科是如何定义这个概念的:

https://en.wikipedia.org/wiki/Thread_safety

  • Thread safety is a computer programming concept applicable to multi-threaded code. Thread-safe code only manipulates shared data structures in a manner that ensures that all threads behave properly and fulfill their design specifications without unintended interaction.

[[256496]]

意思是说:

线程安全是应用于多线程代码的一种计算机编程概念,它确保多个线程能够按照程序的设计正确的访问共享数据结构。

或者再贴近编程语言的角度一点来讲,线程安全指的是同时最少有两个及以上的线程操作共享的数据区域,并且至少有一个是写操作。如果你还想不明白,可以去卫生间观察一下,一个厕位同时能有几个人使用。

线程安全的级别

线程安全的级别或者粒度有三种,如下:

(1)线程安全

这种情况下其实没有线程安全问题,比如上面的例子中,每个人都有自己专用的卫生间,所以不会存在竞争问题。

(2)条件安全

条件安全,顾名思义是有条件的,所有人共用几个卫生间,抢到资源的就把门关上,通过门来隔离资源,后面的人就在外面等待直到里面的人出来。

(3)不安全

这种情况下连门都没有,所以并不能很好保证资源安全,所以这种情况***不能让同时让多个人直接使用。

实现线程安全的方式

大体来说有两种,首先我们明白安全问题来自于竞争,没有竞争就不会有问题。

方式一:

核心思路是避免共享数据结构,共享状态。包括:

(1)使用线程local变量

(2)使用不可变对象

方式二:

核心思路是共享不可避免,需要通过条件来确保按照。包括:

(1)互斥锁

(2)CAS原子操作

Java语言里面实现策略

这里以Java语言为例子,上面谈到的4种方式,其实在Java里面都支持,分别对应的解决手段为:

(1)ThreadLocal变量

(2)不可变对象有String,CopyOnWrite集合类

(3) 互斥锁包括JDK5之前的内置锁synchronized和JDK5之后的Lock接口

(4) J.U.C里面Atom开头的类

可以看出来Java里面的处理策略还是比较多的,当然不同的策略其实也有具体的适用场景,此外引入了线程安全和同步手段会对代码的性能造成一定的影响,这一点需要了解。

一般来说避免共享数据结构是能够比较优雅的解决并发问题,这种程序对多线程更友好,性能也会更高。比如单机的ThreadLocal和分布式的Ator模型。这里面不存在竞争。其次是不可变变量,多线程操作的都是CopyOnWrite,这也是为什么一些动态编程语言如Scala里面的默认数据结构大多数都是不可变的。不可变有不可变的好处,但缺点也是明显的,如果需要频繁对数据修改,那么会创建很多临时对象和占用更多的内存。

上面这两种场景,我们一般称为无锁实现,性能很好。如果避免不了共享数据,那么接着性能比较好的就是CAS这种原子操作,这种情况下我们一般也称是无锁的,但其实是利用了操作系统的原子指令来实现的,在竞争不激烈的场景下性能比较好,一般的编程语言都有封装好的工具类。如果竞争激烈,其实性能未必比使用互斥锁高。互斥锁一般也称重量级锁,需要OS干涉线程的调度,适合用于竞争激烈的场景下,这种方式下线程上下文的交换会降级系统的性能,在使用时需要注意。

线程并发技能图谱

多线程编程领域其实涉及很多计算机知识,线程安全只是其中的冰山一角,作为一名技术人员我们有必要系统的学习和攻破并发编程这一块,很多人觉得并发编程很难,其实是没有掌握系统的学习方法,在这里我放出我之前总结并发知识的一张图谱,供大家参考学习:

查看原图

 

总结

本文主要介绍了什么是线程安全,及实现线程安全的一些手段,并结合Java语言描述了相关的知识,***又总结了Java里面并发学习的知识图谱,只要把里面所有的内容都了解掌握,那么在多线程领域就可以从青铜升级到王者段位了,不过学习之路,学无止境,不能急功近利,一定得重基础,然后循序渐近,日拱一卒,就算慢点也无妨,坚持下去,肯定有所收获。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/122346.html<

赞 (0)
管理的头像管理
上一篇2025-02-22 07:30
下一篇 2025-02-22 07:31

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注