单例下并发的情况下访问私有变量的一个典型问题
一个小问题,单例下 并发的情况下访问私有变量的典型问题,以下是一个小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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构