多线程学习—记录(一)

1.什么是线程安全性?
在线程安全性定义中,最核心的概念就是正确性,正确性的含义是,某个类的行为与其规范完全一致,对正确性有了清晰的定义后,就可以定义线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。也可以将线程安全类认为是一个在并发环境和单线程环境中都不会被破坏的类。

2.竞态条件
导致线程安全问题的一个原因是:在一个类中存在多个竞态条件,从而使结果变得不可靠。当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。换句话说,就是正确结果要取决于于运气。最常见的竞态条件类型就是"先检查后执行"操作,即通过一个可能失效的观测结果决定下一步的动作。

3.延迟初始化中的竞态条件
使用"先检查后执行"的一种常见情况就是延迟初始化,延迟初始化的目的是将对象的传初始化推迟到实际被使用时才进行,同时要确保只能被初始化一次
举例:懒汉式单例模式:在类加载时不初始化
多线程学习—记录(一)_第1张图片
在 SingletonDemo1中包含了一个竞态条件,它可能会破坏这个类的正确性,假定线程A和线程B同时执行getInstance。A看到instance为空,因而创建一个新的实例。B同样需要判断instance是否为空。此时的instance是否为空,要取决于不可预测的时序,包括线程的调度方式,以及A需要花多长时间来初始化SingletonDemo1 并设置instance。如果当B检查时,instance为空,那么在两次调用getInstance时 可能会得到不同的结果,即使通常认为getInstance 返回相同的实例。与大多数并发错误一样,竞态条件并不总是产生错误,但也可能导致严重问题。要避免竞态条件问题,就必须在某个线程改变变量时,通过某种方式阻止其他线程使用这个变量,从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改状态的过程中。

你可能感兴趣的:(多线程学习总结,多线程,线程安全)