日期:2014-05-20  浏览次数:20713 次

多线程同步问题(小问题)
C# code

   private int i = 0;
   private object SycObject=new object(); 
   private void ThreadTest()
   {
    lock (this)
     {
        i++;
     }
   }

   private void TreadTestII()
   {
      lock (SycObject)
      {
          i++;
      }
  }


上面的两种方式有什么区别ThreadTest和TreadTestII
最近做事没劲,提个问题,打打气

------解决方案--------------------
1.lock ThreadTest()
2.lock (object)SycObject
------解决方案--------------------
lock (this)
{
i++;
}
把this 放到Monitor里..当没有线程Monitor 这个实例的时候 执行代码 否则等待其他线程Exit后再执行代码.


你的两个方法...说实话 ThreadTest() TreadTestII() 开始运行 谁都不会等待..

Monitor里有个this 和SycObject 谁都不影响谁






------解决方案--------------------
1 lock(this);把整个对象实例都看作是同步的,作为一个同步对象来用(这个类外面的多线程在访问这个对象时,你在这里必须等待访问完后才能访问
2 lock(syncojbect);类内的多线程间的互斥,如果有一线程正在lock 此同步对象,其它的线程仍然可以访问this的其它状态;
------解决方案--------------------
和楼主有同样的问题,倾听中。。。。
------解决方案--------------------
没区别,大家个不相干!
------解决方案--------------------
lock (this)不是一个好东西。建议不用。
------解决方案--------------------
C# code

public class C
{
    public void do_something()
    {
        lock (this)
        {
            ...
        }
    }
}

C c = new C();
lock (c)
{
    new Thread(c.do_something);
    //c.do_something要等到解锁后才执行。

------解决方案--------------------
1 lock(this)是锁定这个类的对象实例,,如果外部多线程要访问这个类的对象就要等待lock(this)执行完。

2,lock(syncojbect);只是锁定类内部的代码段,,多线程仍然可以访问该类的其他对象。。

看了上面各位老大的回答,不知道我的理解是对的么。
------解决方案--------------------
学习` UP
------解决方案--------------------
ding...
------解决方案--------------------
ding...
------解决方案--------------------
探讨
1 lock(this)是锁定这个类的对象实例,,如果外部多线程要访问这个类的对象就要等待lock(this)执行完。

2,lock(syncojbect);只是锁定类内部的代码段,,多线程仍然可以访问该类的其他对象。。

看了上面各位老大的回答,不知道我的理解是对的么。

------解决方案--------------------
没区别,照我的理解,this或是syncobject只是都起的互斥锁的作用,防止两个线程同时进入一个代码块。
------解决方案--------------------
学习
------解决方案--------------------
lock将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
定义 private 对象来锁定, 或 private static对象变量来保护所有实例所共有的数据。

lock关键字其实就是对Monitor类的Enter()和Exit()方法的封装,并通过try...catch...finally语句块确保在lock语句块结束后执行Monitor.Exit()方法,释放互斥锁。
参考
------解决方案--------------------
如果没有特殊需要,尽量使用lock(syncojbect)
------解决方案--------------------
两种没有区别de说
第一种情况,并不影响访问。
锁并没有以任何方式阻止对对象本身的访问
------解决方案--------------------
探讨
1 lock(this);把整个对象实例都看作是同步的,作为一个同步对象来用(这个类外面的多线程在访问这个对象时,你在这里必须等待访问完后才能访问