首页 新闻 会员 周边 捐助

lock的问题

0
悬赏园豆:50 [待解决问题]

看了这篇文章http://www.cnblogs.com/yuqilin/archive/2011/10/15/2213766.html

想到了一个问题,就是何时用lock(this)呢?

C#
nickycookie的主页 nickycookie | 初学一级 | 园豆:106
提问于:2014-06-17 11:21
< >
分享
所有回答(3)
0

在需要的同步的时候加lock.随便找个会有并发问题的场景都能用lock

lock(this)是把对象本身当成同步对象.这种方法可以在对象内解决并发问题

吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-17 11:22

您说的我知道,我想问的是lock(this)有何用武之地,或者这是种错误的用法,谢谢

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 11:25

@nickycookie: 有没有错看你怎么用.关于你的问题你随便想一个并发场景吧,这个都能用上

 

这种问题老是遇到.这边还是要再提一下,一定不要每遇到一个知识点.

就去想他要在什么样的具体场景下使用.一般都是以为这样能帮助理解.但实际上没有什么意义.因为你工作时基本上遇不到一样的情况,而你根据这种情况去理解,实际上是会有误差的.我以前就有一个这样的同事``有时候一个点,我怎么给他解释都没用....

学习一个知识点,第一件事情一定是理解他的定义.定义是非常非常重要.一切都要以定义为前提

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-17 11:36

@吴瑞祥: 好的,谢谢你的建议,我可能比较死板

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 11:43
2

这本来不是一个问题,在你理解了 lock 的语义后。

究竟 lock 谁,这需要根据你的需求和你的设计来定。

Launcher | 园豆:45050 (高人七级) | 2014-06-17 11:26

那请问下何时应该lock(this)呢?能否举个例子,谢谢

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 11:28

@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){}} }

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-06-17 11:38

@Launcher: 2需要private static object _lock吗?

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 12:33

@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。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-06-17 13:08

@Launcher: 谢谢,再想问下,lock(this)真能做到锁的效果吗?我总觉得lock(object)比较可靠。

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 13:44

@nickycookie: 真能。通过你这么多的问题,我感觉你编程还没入门,因此我反问你一句:你凭什么觉得 lock(object) 比 lock(this) 可靠?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-06-17 13:47

不好意思了。因为感觉lock(this)只是对每个实例作了锁操作,并不是对整个类。不知道我说的是不是正确

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 16:25

@nickycookie: 那么请问 lock(object) 就一定是对整个类吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-06-17 16:28

@Launcher: 如果object是static的话我觉得应该是整个类,可能我理解错了,望指教

支持(0) 反对(0) nickycookie | 园豆:106 (初学一级) | 2014-06-17 16:30

@nickycookie: 那么你这里有个前提,“如果object是static”,如果不是 static,是不是就跟 lock(this) 一样了?那么我们再回到你前面的话:

lock(this)真能做到锁的效果吗?我总觉得lock(object)比较可靠

你这里是建立在你认为 object 是 static 的前提下,但是你没说出来啊!你没说出来,我咋知道?

如果 object 是 static 的,那么你的意图就是要让类型的所有实例都能通过 lock(object) 同步,我告诉你,我连 static 的 object 都不需要,我直接 lock(Type) 就行。

你得描述能有点逻辑性不?别让我老绕进你的坑里,本来是一个关于 lock 的语义和作用范围的问题,被你绕道具体的代码编写上了。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-06-17 16:40
0

本对象加锁,这个 对象会有多线程使用时,并且改对象里有子对象需要同步。

比如 单例模式中,这个单例对象 全局共享,如果单例对象中有一个集合,要保持一致,可以加锁 单例对象,也可以加锁其它 不变对象。

一般不加锁 对象本身,粒度太大,可以选择 一个私有的静态变量

Qlin | 园豆:2403 (老鸟四级) | 2014-06-17 13:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册