首页 新闻 会员 周边

关于全局对象拥有多线程安全性的问题

0
悬赏园豆:30 [已关闭问题] 关闭于 2008-11-29 12:55

我能想到的是有两种方法来为全局对象进行锁定:

客户端调用代码为: CURDExecuterSolverProxy.Instance. GetExecuter();

1.

 

Code
    public static CURDExecuterSolverProxy Instance
{
get
{
lock (_locker)
{
if (_instance == null)
{
_instance
= new CURDExecuterSolverProxy();
}

return _instance;
}
}
}

public ICURDable GetExecuter()
{
// do some thing
}


}

在获取全局对象是进行lock,就是这种方法我存在疑问,是否 在获取Instances时进行lock就能使调用代码具有多线程安全性.

还是要如下编写代码:

Code

即在调用方法中进行lock,才能实现客户端调用代码的多线程安全性,但是这么做的话感觉太麻烦了.

 

希望各位大侠予以指点

 

 

父辈的旗帜的主页 父辈的旗帜 | 初学一级 | 园豆:2
提问于:2008-11-15 22:00
< >
分享
所有回答(1)
0

    好像是你概念上混淆了,或者想多了。线程安全有必要通过某个类去实现吗?线程安全是因为某个变量存在并发行为,而设法对其被占用进行约束而已。

    对于你当前的应用来说,只要一段

     private static object _locker = new object();

    就可以了,而在会被多线程调用的具体方法上,

[public]  [ICURDable] GetExecuter(){
lock(_locker){
// 含共享、但不可并发变量的执行代码
}
 }

    而这样的可并发方法,对外就宣称“线程安全”了。

    如果你将“线程安全”的要求设计成类,而其实以上3行代码就能实现(_lock, lock(_lock){}),大概是在画蛇添足呢!

    我对理论理解的不深,也是基于自己的实践、认识,只是个人意见,呵呵。

    另外,如果你的类不是为了包装线程安全,而是某个线程安全的应用的话,

  get {
lock (_locker) {
if (_instance == null) {
_instance
= new CURDExecuterSolverProxy();
}
return _instance;
}
}

    改造一下:

 get {
if (_instance == null) {

lock (_locker) {

 if (_instance == null)//并发试探
_instance = new CURDExecuterSolverProxy();
}

}

return _instance;
}

    这样读取的效率要高一些(或很多)。

陛下 | 园豆:3938 (老鸟四级) | 2008-11-16 22:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册