线程安全性

Posted 竹马今安在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全性相关的知识,希望对你有一定的参考价值。

对象的状态指存储在状态变量(例如实例或者静态域)中的数据,对象的状态可能包括其他依赖对象的域。

要编写线程安全的代码,核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问。“共享”意味着变量可以由多个线程同时访问,“可变”意味着变量的值在其生命周期内可以发生变化

什么是线程安全性?

当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的!

无状态的对象一定是线程安全的!

 

原子性

一个操作是不可分割的,就是原子性的操作,假如一个操作能够分成几个独立的操作,就不是原子性的。

在并发编程中,由于不恰当的执行时序而出现不正确的结果是一种非常重要的情况,这种情况叫做:

竞态条件


当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。

举例:

你和朋友约定好了在一条街上的咖啡馆见面,但是这条街上有两家同样的咖啡馆,你不知道要碰面的是哪家,十二点十分,你在咖啡馆A没有看到朋友,就去咖啡馆B,十二点十五,你到达了咖啡馆B,也没有发现朋友,但可能你朋友在这段时间内也到过了这两家咖啡馆,只是你到的时候他没在,你不在的时候他在了。在这个“你要看看他在不在另一家店的问题里”,问题在于首先看了看A,发现不在,就要去B找,在B中可以做出同样的选择,但是A和B之间需要一段路程,在十二点十分到十二点十五这段时间内可能系统的状态已经发生了变化,当你刚迈出A的前门,朋友从A的后门进来了......

最常见的竞态条件类型就是“先检查后执行”,基于一种可能失效的观察结果来做出判断或者执行某个计算:一个线程观察到某个结果为真,进行下一步操作,但事实上可能另一个线程再次之前已经执行了这个操作,这个观察结果已经无效了,从而导致各种问题的出现

竞态条件容易与数据竞争混淆:数据竞争是指访问共享的非final类型的域时没有采用同步来进行协同,那么就会出现数据竞争。当一个线程写入一个变量而另一个线程接下来读取这个变量,或者读取一个之前有另一个线程写入的变量时,并且在这两个线程之间没有使用同步,那么可能出现数据竞争。

 

以上是关于线程安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何创建线程?如何保证线程安全?

多线程(四):线程安全

如何确保Java线程安全?

如何创建线程?如何保证线程安全?

如何保证线程安全?

线程安全和非线程安全