设为首页 加入收藏

TOP

关于单例模式的心结
2014-11-23 18:57:09 】 浏览:9647
Tags:关于 单例 模式 心结
今天重构公司的代码,看到有一个单例的对象,在整个系统中到处都存在调用它的身影,因为我们这个项目会在应用服务器(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个线程,没有发现重复的值存在,难道我的理解是错误的吗?我记得在多线程下操作同一数据是会出现这个问题的?不知道这个对单例模式是否适用呢?纠结纠结,求准确的回复
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ImageView根据手势进行缩放,拖动 下一篇freescale-sdk linux移植一搭建编..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目