线程安全笔记一——线程安全概念

一、什么是线程安全:

        个人理解:线程安全是指一段代码或程序,在多线程的情况下执行时,仍然能做出所期望的结果或行为。也就是说,如果一段代码或程序是单线程的,则他必定是线程安全的。换句话说,线程安全都是指的多线程。

        需要考虑线程安全的程序,必定是多线程的。但不是所有的线程安全的程序都需要考虑线程安全问题。只有在程序中存在可变的状态,同时外界可以访问或修改这个状态时,才需要考虑线程安全。

        可变的状态,其实就是一段可以改变的数据。若数据不是可变的,或不被外界访问或修改时,则此段代码同样不需要考虑线程安全问题。

二、什么是竞态条件(Race Condition)

        说到线程安全,有一个词跟线程安全息息相关——竞态条件,书上正规的解释:由于两个或者多个进程竞争使用不能被同时访问的资源,使得这些进程有可能因为时间上推进的先后原因而出现问题,这叫做竞争条件。

        其实一开始看到这个竞态条件很难理解(也有可能个人理解能力有限- -),Race 直面翻译为竞争,Condition 直面翻译为状态。Race Condition则指的是线程之间竞争的一种状态,竞争的东西就是程序里的资源、数据,也就是上个节说的可变状态。(PS:编程的东西好多都是老外写的,毕竟计算机是老外发明的,这就造成了很多比较官方的书籍,其实都是出版社翻译国外的,然后再出版。大部分的内容,翻译是没问题的,但有的部分可能看英文更容易理解)

        个人总结一下就是,如果说一个程序存在线程安全问题,则可以说这个程序存在竞态条件。存在静态条件,则代表线程不安全。

三、如何检查程序是否是线程安全的

        对于一小段代码,熟悉线程安全知识的人一眼就能判断这段代码是否线程安全,但在实际工作中,项目往往是比较庞大的,有时即使不算引用的框架,可能也有很多的代码量。况且有一部分公司都会用自己的框架(比较牛X的公司)或是自己对一些开源框架进行再封装(这样做的公司有两类,一类是公司里有技术大牛,封装的非常完美。另一种是公司里有装b大神,封装的漏洞百出)。所以想要检测出项目中是否存在线程安全问题是比较困难的。

        方法一:对部分代码进行单独测试。

        方法二:压力测试。

        方法三:检测工具。

        以上三种方法都不能完全保证检测出项目中所有的问题。其实对于线程安全问题重点不是在发现,而是在编写代码的时候就通过线程安全知识去避免问题的发生。而对于线程安全的编码技巧有很多很多,这些技巧会在之后的文章中为大家一一列举并详细分析。

        如果对于以上文章有什么不对的地方,或建议,欢迎各位大佬们提出,也可评论留言,大家一起交流一下。

猜你喜欢

转载自blog.csdn.net/apricotCandy/article/details/80080745