我能想到的是有两种方法来为全局对象进行锁定:
客户端调用代码为: 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,才能实现客户端调用代码的多线程安全性,但是这么做的话感觉太麻烦了.
希望各位大侠予以指点
好像是你概念上混淆了,或者想多了。线程安全有必要通过某个类去实现吗?线程安全是因为某个变量存在并发行为,而设法对其被占用进行约束而已。
对于你当前的应用来说,只要一段
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;
}
这样读取的效率要高一些(或很多)。