录一室
录一事, 求一知, 本一意, 笃一行
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
posts - 9, comments - 50, trackbacks - 0
公告
本站所有文章均为原创,版权归本人所有,欢迎转载,但请注明出处。
我的主页
个人资料
我的闪存
发短消息
<
2006年2月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
我参与的团队
.Net 商业智能(0/0)
随笔分类
(6)
64位操作系统(1)
ASP.NET编程实践(2)
多线程编程技术(3)
随笔档案
(6)
2007年5月 (1)
2006年3月 (2)
2006年2月 (3)
最新随笔
1. 安装配置支持中文的64位Windows2003
2. 通过系统配置来提高ASP.NET应用程序的稳定性(续)
3. 通过系统配置来提高ASP.NET应用程序的稳定性
4. ASP.Net应用程序的多进程模型
5. 编写线程安全的单件(Singleton)
6. .Net 下信号量(Semaphore)的一种实现
积分与排名
积分 - 14977
排名 - 4474
最新评论
1. re: 安装配置支持中文的64位Windows2003
解决了我的问题,谢谢岛主。
--franson
2. re: 安装配置支持中文的64位Windows2003
有谁有64位windows2003企业版的序列号
--rst
3. re: 安装配置支持中文的64位Windows2003
没有序列号
--风行天下
4. re: 安装配置支持中文的64位Windows2003
Windows.Server.2003.R2.Ent.x64.With.Sp2.CHS.VOL.MSDN
--ck
5. re: 安装配置支持中文的64位Windows2003[未登录]
估计楼主是先前没用过英文版的WINDOWS吧!
--恩电
阅读排行榜
1. 安装配置支持中文的64位Windows2003(4457)
2. 编写线程安全的单件(Singleton)(2351)
3. 通过系统配置来提高ASP.NET应用程序的稳定性(2072)
4. .Net 下信号量(Semaphore)的一种实现(1962)
5. ASP.Net应用程序的多进程模型(1615)
评论排行榜
1. 安装配置支持中文的64位Windows2003(14)
2. 通过系统配置来提高ASP.NET应用程序的稳定性(13)
3. 编写线程安全的单件(Singleton)(10)
4. .Net 下信号量(Semaphore)的一种实现(8)
5. 通过系统配置来提高ASP.NET应用程序的稳定性(续)(4)
编写线程安全的单件(Singleton)
最近在 Review 代码的时候,发现大量类似如下风格的
单件
(Singleton)类:
/**/
///
<summary>
///
线程不安全的 Singleton
///
</summary>
public
class
Singleton
{
static
private
Singleton instance;
private
Singleton()
{
//
//
TODO: Add constructor logic here
//
}
static
public
Singleton Instance
{
get
{
if
( instance
==
null
)
instance
=
new
Singleton();
return
instance;
}
}
}
乍一看还很经典,但细一推敲,却发现了问题:
当
多个线程
同时调用 Singleton.Instance 属性的时候,每个
线程
都检测到 instance == null 为真,于是每个都会傻乎乎的创建一个新实例.这将导致最先创建的实例实效,只有最后创建的实例被保存在静态的 instance 中.虽然这在大多数情况下不会引发大问题,但一旦构造函数中有比较耗时的操作,则会造成程序逻辑上的错误.而这些通常都是隐藏得很深,而且很难复现的超级大Bug .所以,要小心哪,同志们!
为了避免这种问题,我采用了下面的代码:
/**/
///
<summary>
///
线程安全的 Singleton
///
</summary>
public
class
ThreadSafeSingleton
{
static
private
ThreadSafeSingleton instance;
static
private
object
syncObj
=
new
object
();
//
用于线程同步
private
ThreadSafeSingleton()
{
//
//
TODO: Add constructor logic here
//
}
static
public
ThreadSafeSingleton Instance
{
get
{
lock
( syncObj )
//
使用 Monitor 同步
{
if
( instance
==
null
)
instance
=
new
ThreadSafeSingleton();
return
instance;
}
}
}
}
0
0
0
(请您对文章做出评价)
«
上一篇:
.Net 下信号量(Semaphore)的一种实现
»
下一篇:
ASP.Net应用程序的多进程模型
posted on 2006-02-17 00:06
录一事流
阅读(2351)
评论(10)
编辑
收藏
所属分类:
多线程编程技术
Feedback
335690
#1楼
2006-02-17 00:47 |
lx[未注册用户]
static ThreadSafeSingleton Instance
{
get
{
if( instance == null )
{
lock( syncObj ) //使用 Monitor 同步
{
if( instance == null )
instance = new ThreadSafeSingleton();
}
}
return instance;
}
}
回复
引用
#2楼
2006-02-17 08:01 |
补丁
又写一遍:
public class ThreadSafeSingleton
{
private ThreadSafeSingleton()
{
}
public static ThreadSafeSingleton Instance = getInstance();
static ThreadSafeSingleton getInstance()
{
return new ThreadSafeSingleton();
}
}
回复
引用
查看
#3楼
2006-02-17 08:36 |
Terrylee
楼主的这种写法也会存在问题
详细请参加我以前写的Sigleton模式的随笔
http://terrylee.cnblogs.com/archive/2005/12/09/293509.html
回复
引用
查看
#4楼
2006-02-17 08:46 |
Nomagic
.NET里实现Singleton用static readonly就好了嘛,不要太理论化了。
回复
引用
查看
#5楼
2006-02-17 09:45 |
windaa[未注册用户]
public class ModuleController
{
private static Dictionary<int, IOAModule> _ModuleList;
public static Dictionary<int, IOAModule> ModuleList
{
get
{
if (_ModuleList == null)
{
lock(_ModuleList)
{
if(_ModuleList==null)
{
_ModuleList = LoadAll();
}
}
}
return _ModuleList;
}
}
}
各位老大看看这个有什么问题吗
回复
引用
#6楼
[
楼主
]
2006-02-17 09:52 |
录一事流
@Terrylee
受教, 文章中的双重锁定方式应是更优的一种实现(避免每次访问都加锁). 谢谢 :)
回复
引用
查看
#7楼
[
楼主
]
2006-02-17 12:16 |
录一事流
@windaa
lock ( _ModuleList ) 这句有问题, 第一次调用时, ModuleList 还是空,而 lock( object ) 语法 等价于 System.Threading.Monitor.Enter( object ), 语句, 这里, object 必须是一个存在的实例.
回复
引用
查看
#8楼
2006-02-17 13:04 |
阿不
类似的代码太多了。
回复
引用
查看
#9楼
2006-02-22 14:50 |
秋枫[未注册用户]
public sealed class Singleton
{
static readonly Singleton instance=new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
Singleton()
{
}
public static Singleton GetInstance()
{
return instance;
}
}
更多
http://blog.csdn.net/zhzuo/archive/2004/07/16/42685.aspx
回复
引用
#10楼
2006-02-22 19:14 |
louisliu
@秋枫
好文! 谢谢!
回复
引用
注册用户登录后才能发表评论,请
登录
或
注册
。
博客园首页
IT新闻
闪存
知识库
招聘
找优秀程序员,就在博客园
IT新闻
:
·
分析师称PC硬件限制3D流媒体视频发展
·
JBoss Seam 2.2.1 CR1正式发布
·
惠普金牌服务工程师:金牌维修站使用旧配件
·
Java创始人:甲骨文会继续支持Java
·
分析:Google的Nexus One智能手机算是失败吗?
每天10分钟,轻松学英语
专题:
Android
iPad
jQuery
Windows 7
推荐职位
:
网站导航:
博客园首页
IT新闻
个人主页
闪存
程序员招聘
社区
博问
网摘
China-pub 计算机图书网上专卖店!6.5万品种2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关搜索:
多线程编程技术
在知识库中查看:
编写线程安全的单件(Singleton)