zoukankan      html  css  js  c++  java
  • 单例下并发的情况下访问私有变量的一个典型问题

    一个小问题,单例下 并发的情况下访问私有变量的典型问题,以下是一个小Demo

    public class dssd
        {
            static void Main(string[] args)
            {
                var t = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(1000);
                    var obj2 = ImportProvider.Instance;
                    
                    Arg ds = new Arg() { TypeSS = 2 };
                    obj2.Import(ds);
                            
                });
    
                var obj = ImportProvider.Instance;
    
                obj.Import(new Arg() { TypeSS = 1 });
                                    
                Console.Read();
            }    
        }
    
    
        public interface IImportProvider
        {
            string Import(Arg args);
        }
    
        public class ImportProvider : IImportProvider
        {
            #region 单例
            public static readonly IImportProvider _instance = new ImportProvider();
    
            private ImportProvider() { }
    
            public static IImportProvider Instance { get { return _instance; } }
            #endregion
    
            public string Import(Arg args)
            {
                Yaya = new List<int>() { args.TypeSS };
                HSSFWorkbook workBook = new HSSFWorkbook() { dddd =args.TypeSS};
    
                if (args.TypeSS==1)
                {
                    Thread.Sleep(5000);
                    Console.WriteLine(Yaya[0]);               
                }        
                
                return "ssss";
            }
    
            private List<int> Yaya = new List<int>();
    
        }
    
       
    
    
        public class HSSFWorkbook
        {
            public int dddd { get; set; }    
        }
    
        public class Arg
        {
            public int TypeSS { get; set; }
    
        }

    毫无疑问,第一个输出的 2,

    因为在 Thread.Sleep(5000);

    之后,Yaya[0]的值被 t线程走的代码给改了,这是单例下,私有变量遇到的一个常见的问题。在并发线程访问的情况下,她们是共享私有变量的,像上面这种情况,主线程中获取到了开启的工作线程改后变量值,问题典型,所以标一下
    改后:

    public class dssd
        {
    
    
            static void Main(string[] args)
            {
                List<int> Yaya = new List<int>();
    
                var t = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(1000);
                    var obj2 = ImportProvider.Instance;
                    
                    Arg ds = new Arg() { TypeSS = 2 };
                    obj2.Import(ds, Yaya);
    
                });
    
                var obj = ImportProvider.Instance;
    
                obj.Import(new Arg() { TypeSS = 1 }, Yaya);                      
              
                Console.Read();
            }
    
        }
    
    
        public interface IImportProvider
        {
            string Import(Arg args, List<int> ww);
        }
    
        public class ImportProvider : IImportProvider
        {
            #region 单例
            public static readonly IImportProvider _instance = new ImportProvider();
    
            private ImportProvider() { }
    
            public static IImportProvider Instance { get { return _instance; } }
            #endregion
    
            public string Import(Arg args,List<int> ww)
            {
                ww = new List<int>() { args.TypeSS };
                HSSFWorkbook workBook = new HSSFWorkbook() { dddd =args.TypeSS};
    
                if (args.TypeSS==1)
                {
                    Thread.Sleep(5000);
                    Console.WriteLine(ww[0]);               
                }        
                
                return "ssss";
            }
    
        }
    
       
    
    
        public class HSSFWorkbook
        {
            public int dddd { get; set; }    
        }
    
        public class Arg
        {
            public int TypeSS { get; set; }
    
        }

     输出:1

  • 相关阅读:
    Django REST framework (DRF)框架入门之权限【五】
    Django REST framework (DRF)框架入门之视图【四】
    Django REST framework (DRF)框架入门之视图【三】
    restFul接口设计规范
    Django REST framework (DRF)框架入门之序列化---反序列化【二】
    Django REST framework (DRF)框架入门之序列化【一】
    Vue自动化工具(Vue-cli)基础3
    Vue.js 基础2
    Vue.js 基础1
    Django 下载功能中文文件名问题
  • 原文地址:https://www.cnblogs.com/wwkk/p/10321824.html
Copyright © 2011-2022 走看看