最近看了一篇关于多线程资源竞争使用lock的一个例子,如下:
static int nextId;
static object mutex = new object();static int NextId()
{
   lock (mutex)
   {
      return customerId++;
   }
}我的问题是,为什么要加一个object 对象mutex,而不直接使用lock(nextId)呢?
static int nextId;
static int NextId()
{
   lock (nextId)
   {
      return customerId++;
   }
}

解决方案 »

  1.   

    Monitor类和Lock的用法差不多。两个都是锁定数据或是锁定被调用的函数。
    而Mutex则多用于锁定多线程间的同步调用。Monitor和Lock多用于锁定被调用端,而Mutex则多用锁定调用端
      

  2.   


    因为,那个 nextID 很可能有别的用途,而object型的 mutex 是专用来给你 lock 的……MSDN上就是这么用的:LOCK 语句
      

  3.   

    lock语句的参数必须是基于引用类型的对象,nextId是int类型,不能作为lock的参数。
      

  4.   

    lock语句的参数必须是基于引用类型的对象思考思考
      

  5.   

    mutex是一个互斥变量,要访问的变量在访问之前都要看看是不是正在用mutex.
    本来访问变量就在访问你怎么把它作为互斥变量用,显然不合逻辑
    楼主给分哦
      

  6.   

    浪费,直接:
    static int nextId;
    static int NextId()
    {
      return Interlocked.Increase(ref nextId);
    }
      

  7.   

    写错了,customerId应该改为nextId。不好意思。
      

  8.   

    lock只能使用引用类型来锁定。事实上你这个问题没有多少意义,只要是引用类型,都可以作为锁的对象。唯一的一个技巧就是,你可以根据不同的请求的规律来创建一个对象组,相似的请求使用其中的一个对象锁定来达到同步,不相似的则用不同的对象来锁定,,从而降低锁冲突而提高效率。对于你这短代码,你完全可以用return Interlocked.Increment(ref nextId);来代替