关于单例模式的心结

  今天重构公司的代码,看到有一个单例的对象,在整个系统中到处都存在调用它的身影,因为我们这个项目会在应用服务器(server)第一次启动的时候加载数据库中的代码表(为什么要先加载,因为这个项目采用的是C/S模式,利用remoting进行通信,在客户端启动的时候会多次获取代码表中的不同数据。)

 1  public class CodeTableSingleTon
 2 {
 3     ///防止外部被实例化
 4    private CodeTableSingleTon(){
 5        //进行数据的读取操作
 6    }
 7    //
 8   private static readonly object _lock=new object();
 9 
10   private static CodeTableSingleTon _instance;
11   
12    public static CodeTableSingleTon Instance
13   {
14   get
15    {
16     if(_instance==null)
17      {
18          lock(_lock){
19             if(_instance==null) 
20             {
21             _instance=new CodeTableSingleTon();   
22             }
23           }
24     }
25   return _instance;
26    }
27 }
28 
29 
30 }

上面代码就是项目的实现方式,我了解过单例模式,单例模式是控制对象的创建,可以实现延迟加载,只有在对象被调用的时候才会真正的执行对象的实例化,可以在一定程度上减少内存的耗用(是在不使用该对象的情况下)。既然在整个系统中只有一个该对象, 因为项目是采用多线程处理客户端的请求,所以每个线程都可以获取到该对象进行数据的获取,系统运行也没发现 由于这个对象的创建或者其他问题。

 

  但是我深入的想了一下,如果我在单例对象中加入一个计数器,表示单例对象被调用的次数,那么这个对象内部的属性 可能会同时被多个线程进行更新。

 1 public class SingleTon
 2 {
 3 
 4   private static SingleTon _instance;
 5   private static readonly object _lock=new object();
 6   private SingleTon(){} //私有的构造函数 确保该实例不能在外部直接通过new实例化
 7   public static long totalNum=0;//初始化计数器默认值为0
 8   public static SingleTon Instance
 9   {
10   get  
11   {
12     if(_instance==null)
13       {
14        lock(_lock)
15        {
16           if(_instance==null)
17           {
18           _instance=new SingleTon();
19           }
20        }
21       }
22       totalNum=totalNum+1; //每次调用计数器都会加1
//Consle.WriteLine(totalNum);
23 return _instance; 24 } 25 } 26 }

 

我尝试开启了多个线程来执行这段代码,没有发现totalNum的值存在由于多个线程的调用出现重复数据输出的情况。那么我心里一直在纠结一个事,就是说假如两个线程都在同一时间获取到了这个单例对象,那么都会依次执行计数器加1,如果说两个线程执行到totalNum=totalNum+1 这句话的时候不是在同时的,那么不会出现问题。

如果这两个线程中了彩票了,同时执行了totalNum=totalNum+1,那么就会导致计数器少算了一次调用吗?我在测试,开启了100个线程,没有发现重复的值存在,难道我的理解是错误的吗?我记得在多线程下操作同一数据是会出现这个问题的?不知道这个对单例模式是否适用呢?纠结纠结,求准确的回复

 

如果单例的方式存在问题,那么采用静态字段也会出现这个问题,就无法统计计数器了。mygod  脑袋要炸了

 

转载于:https://www.cnblogs.com/jiagoushi/p/4104763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一款名为《心灵探险》的虚拟现实游戏,旨在帮助玩家通过探索、互动和体验来治愈心理疾病。在游戏中,玩家将扮演主人公,与角色一起进行一系列心理治疗过程,以帮助他们克服内心的障碍和情感问题。以下是这个游戏的简要概述: 游戏起点 玩家进入游戏后,首先需要完成一份简单的问卷,以帮助游戏了解玩家的情感状态和治疗需求。玩家随后将与主人公一起进入一个神秘的世界,这里充满着挑战和未知。 探索世界 在这个虚拟世界中,玩家将与主人公一起探索各种场景,包括美丽的森林、神秘的城堡和海底世界等。在探索过程中,玩家可以与各种角色进行互动,听取他们的故事和分享自己的情感经历。 治疗过程 在游戏中,玩家将经历一系列治疗过程,例如放松训练、认知重构、行为疗法等。这些过程旨在帮助玩家改善自我意识、降低焦虑和压力、增强情绪调节等。在这些过程中,玩家可以与主人公一起互动和体验,从而更好地理解和掌握治疗技能。 治疗效果 随着游戏的进行,玩家将不断提高自己的治疗水平和自我认知能力。游戏将根据玩家的表现和反馈,为他们量身定制治疗计划和建议。玩家可以随时查看自己的治疗进度和成果,以鼓励自己继续前进。 结论 《心灵探险》是一款专为心理治疗而设计的虚拟现实游戏。通过探索、互动和体验,玩家可以获得更深入的自我认识和情感调节技能,从而有效地治疗心理疾病。这个游戏旨在为那些需要心理支持和治疗的人群提供一个安全、隐私和有效的治疗环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值