在学习多线程的过程中,因为是非科班学生,操作系统的东西都是一知半解的,所以很多名词都没有理解,另外具体的Java虚拟机如何工作还需要后续的学习,这里只能慢慢学习了,等到这本书看完好好读读操作系统的东西以及Java虚拟机机制

下面是一个博文讲解了竞态条件的基本概念和常见的情况

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

最常见的竞态条件为:

一,先检测后执行。执行依赖于检测的结果,而检测结果依赖于多个线程的执行时序,而多个线程的执行时序通常情况下是不固定不可判断的,从而导致执行结果出现各种问题。

对于main线程,如果文件a不存在,则创建文件a,但是在判断文件a不存在之后,Task线程创建了文件a,这时候先前的判断结果已经失效,(main线程的执行依赖了一个错误的判断结果)此时文件a已经存在了,但是main线程还是会继续创建文件a,导致Task线程创建的文件a被覆盖、文件中的内容丢失等等问题。

多线程环境中对同一个文件的操作要加锁。

 

二,延迟初始化(最典型即为单例)

public class ObjFactory {
	private Obj instance;
	
	public Obj getInstance(){
		if(instance == null){
			instance = new Obj();
		}
		return instance;
	}
}

线程a和线程b同时执行getInstance(),线程a看到instance为空,创建了一个新的Obj对象,此时线程b也需要判断instance是否为空,此时的instance是否为空取决于不可预测的时序:包括线程a创建Obj对象需要多长时间以及线程的调度方式,如果b检测时,instance为空,那么b也会创建一个instance对象

 

和大多数并发错误一样,竞态条件不总是会产生问题,还需要不恰当的执行时序

本文来自 sean-zou 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/a19881029/article/details/8113662?utm_source=copy

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐