多线程同步问题(小问题)
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);把整个对象实例都看作是同步的,作为一个同步对象来用(这个类外面的多线程在访问这个对象时,你在这里必须等待访问完后才能访问