看了这篇文章http://www.cnblogs.com/yuqilin/archive/2011/10/15/2213766.html
想到了一个问题,就是何时用lock(this)呢?
在需要的同步的时候加lock.随便找个会有并发问题的场景都能用lock
lock(this)是把对象本身当成同步对象.这种方法可以在对象内解决并发问题
您说的我知道,我想问的是lock(this)有何用武之地,或者这是种错误的用法,谢谢
@nickycookie: 有没有错看你怎么用.关于你的问题你随便想一个并发场景吧,这个都能用上
这种问题老是遇到.这边还是要再提一下,一定不要每遇到一个知识点.
就去想他要在什么样的具体场景下使用.一般都是以为这样能帮助理解.但实际上没有什么意义.因为你工作时基本上遇不到一样的情况,而你根据这种情况去理解,实际上是会有误差的.我以前就有一个这样的同事``有时候一个点,我怎么给他解释都没用....
学习一个知识点,第一件事情一定是理解他的定义.定义是非常非常重要.一切都要以定义为前提
@吴瑞祥: 好的,谢谢你的建议,我可能比较死板
这本来不是一个问题,在你理解了 lock 的语义后。
究竟 lock 谁,这需要根据你的需求和你的设计来定。
那请问下何时应该lock(this)呢?能否举个例子,谢谢
@nickycookie: 我等于没说啊!我举一个例子,然后你自己得理解清楚我提示的设计要点。
我们的需求是设计一个线程安全的可以改变对象状态的类:
class StateObj
{
private int _state;
public void ChangeState(int newState)
{
switch(_state)
{
case 0: _state = newState;break;
case 1: break;
case 2: _state += newState;break;
default: _state = newState;break;
}
}
}
很显然 ChangeState 不是一个线程安全的方法,为了保证线程安全,我们简单的使用 lock ,那么这个时候我们有三种做法:
1、在 ChangeState 外部使用 lock ,类似如下:
Map<StateObj,object> changeStateLockList = new Map<StateObj,object>();
StateObj obj = new StateObj(1);
object changeStateLock = new object;
changeStateLockList.Insert(obj,changeStateLock);
lock(changeStateLockList[obj])
{
obj->ChangeSate(10);
}
2,在 ChangeState 内部使用一个 lock 对象,如下:
class ObjectState{private int _state;private object _lock; void ChangeState(int){ lock(_lock){}} }
3、此对象太简单了,状态修改不需要同其它属性同步,因此,直接使用 lock(this)
class ObjectState{private int _state;void ChangeState(int){ lock(this){}} }
@Launcher: 2需要private static object _lock吗?
@nickycookie: 不是需不需要的问题,而是我可以这么设计我的代码。你能明白设计考量吗?当然我可以给你举个例子,比如:
class nickycookie
{
int a;
int b;
}
由于需求上定义 a , b 两者没有相关性,但是各自的修改需要保持线程安全,那么我可以简单的 lock(this),或者 lock(_lock),但是,考虑到性能问题,我就需要分别持有两把锁,如下:
class nickycookie
{
int a;
object a_lock;
int b;
object b_lock;
}
这样我访问 a 的时候,我用 a_lock,访问 b 的时候,用 b_lock。
@Launcher: 谢谢,再想问下,lock(this)真能做到锁的效果吗?我总觉得lock(object)比较可靠。
@nickycookie: 真能。通过你这么多的问题,我感觉你编程还没入门,因此我反问你一句:你凭什么觉得 lock(object) 比 lock(this) 可靠?
不好意思了。因为感觉lock(this)只是对每个实例作了锁操作,并不是对整个类。不知道我说的是不是正确
@nickycookie: 那么请问 lock(object) 就一定是对整个类吗?
@Launcher: 如果object是static的话我觉得应该是整个类,可能我理解错了,望指教
@nickycookie: 那么你这里有个前提,“如果object是static”,如果不是 static,是不是就跟 lock(this) 一样了?那么我们再回到你前面的话:
lock(this)真能做到锁的效果吗?我总觉得lock(object)比较可靠
你这里是建立在你认为 object 是 static 的前提下,但是你没说出来啊!你没说出来,我咋知道?
如果 object 是 static 的,那么你的意图就是要让类型的所有实例都能通过 lock(object) 同步,我告诉你,我连 static 的 object 都不需要,我直接 lock(Type) 就行。
你得描述能有点逻辑性不?别让我老绕进你的坑里,本来是一个关于 lock 的语义和作用范围的问题,被你绕道具体的代码编写上了。
本对象加锁,这个 对象会有多线程使用时,并且改对象里有子对象需要同步。
比如 单例模式中,这个单例对象 全局共享,如果单例对象中有一个集合,要保持一致,可以加锁 单例对象,也可以加锁其它 不变对象。
一般不加锁 对象本身,粒度太大,可以选择 一个私有的静态变量