搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 手机电脑黑客 > 细说 | 如何理解什么是线程安全?

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

手机电脑黑客 2019-02-11
举报

    听说世界上只有百分之3的人关注Jayson,很幸运你是其中一位 

什么是线程安全

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

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.

意思是说:

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

线程安全的级别

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

(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语言描述了相关的知识,最后又总结了Java里面并发学习的知识图谱,只要把里面所有的内容都了解掌握,那么在多线程领域就可以从青铜升级到王者段位了,不过学习之路,学无止境,不能急功近利,一定得重基础,然后循序渐近,日拱一卒,就算慢点也无妨,坚持下去,肯定有所收获。

         点赞会好看也会世界和平,关注+点赞又能大富大贵又能世界和平


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《细说 | 如何理解什么是线程安全?》的版权归原作者「手机电脑黑客」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报