zoukankan      html  css  js  c++  java
  • Java并发之多线程下竞态条件概念的理解

    一、简述

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

    二、常见竞态条件分析

    最常见的竞态条件为

    1.先检测后执行

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

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

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

    2.延迟初始化(最典型即为单例)

    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对象

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

    Java并发编程(七):线程安全策略

  • 相关阅读:
    cf415D Mashmokh and ACM(DP)
    [USACO]EulerianTour (欧拉通路)
    hdu2544 (SPFA)
    hdu2544 (bellman-ford)
    [TC]SRM615 div1 250 AmebaDiv1
    Step By Step (zz from UESTC)
    [USACO]Sweet Butter 多种解法
    Node.js权威指南 (3)
    Web开发常见问题荟萃
    比较vue.js react.js angular.js
  • 原文地址:https://www.cnblogs.com/shamo89/p/10314325.html
Copyright © 2011-2022 走看看