关于Lock的用法 object lockThis = new object ();这个不行,要放到全局,而且最好是static的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 放到全局或者改为静态总之就是互相需要排队的过程,要lock同一个对象 比如lock(a){过程1}lock(a){过程2}lock(b){过程3}lock(b){过程4}过程1和2不能多线程同时执行,需要排队过程3和4不能同时执行前提是a和b需要是全局变量或静态变量,否则每进入方法都实例化一次,虽然名字相同,但是其实不是一个东西 lock第一点就是要保证你这个东西多个线程之间都可以识别,你这样在方法内写这样有啥用,只有每个线程才认识这个object就跟楼上说的,你这个得放到全局变量里面,至于是否需要static,或者说是否可以static,看你实际设计,我就设计过只能绝对不能static的,因为设计中这个类虽然不是单例,但它是被其它单例类包含的,所以只能非static的object object lockThis = new object ();就算这个该为全局的也不行吧!如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢? object lockThis = new object ();该为全局如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?你怎么看 当然不会。public int Function(int a,int b)a和b是参数,每次调用时传值进来,两次调用function是不会相互影响的。你的例子里应该都不需要lock呀。public int Function(int a,int b){ int c; c=a+b; return c;}应该是不会报错的。 你的例子里没有任何需要lock的地方1.首先a和b是参数传递进来的,并不是直接使用a和b的地址2.对a和b只有取值,没有赋值3.变量c是个局部变量,两个线程同时执行,并不是同一个c object lockThis = new object ();就算这个该为全局的也不行吧!如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?线程1调用Function 时int 一个c 线程2 调用Function时又int 一个c所以线程1和2是不影响的 除非线程处理模块有公用的资源,这样才能够使用lock,对公用资源进行锁定,一个线程用完了,另外一个线程接着用锁定资源可以直接初始化一个object对象,需要全局的,然后线程内部锁定这个对象,开始干活,干完活,释放这个对象,等着下一个线程锁定。。 lock (lockThis) { c=Funtion();//如果Funtion()是外部函数就要lock对不对? } 你这样每一个 function的类都有一个 类对象,每一个类对象里面都有一个lockThis,岂不是失去作用了 lock (lockThis) { c=Funtion();//如果Funtion()是外部函数就要lock对不对? } 我觉得你还是从计算机基础开始学起吧这跟函数放哪里有任何关系? lock (lockThis) { c=Funtion();//如果Funtion()是外部函数就要lock对不对? } 锁不锁是看需求的,只有当多线程会有冲突才需要诶; static int c; static readonly object lockThis =new object();public void Function(int a,int b){ lock (lockThis) { c=a+b; // 多线程对一个全局变量做写入操作,此时才会有冲突可能诶 } } 一句话,当多个线程需要同时访问一个对象的时候会出错,这时候就需要排队,然后就是LOCK 创建窗口句柄时出错 帮我看下这个问题 获取 DataTable 重复数据 算法高手进 集思广意 统计信息 VS2005中combobox 的问题 为什么会查找不到相应tabPage?在线等! 请思归,速马大侠出手相救呀。。。。。。。。。。 续 5个数字3 个一组 算法 c#——xmlDocument 类修改xml文件 请教如何将以下的json格式转为DataTable ? WinForm中DataGridView使用问题请教 求大神把PHP的帮我翻译成C#感激不尽啊
总之就是互相需要排队的过程,要lock同一个对象
lock(a){过程1}
lock(a){过程2}
lock(b){过程3}
lock(b){过程4}
过程1和2不能多线程同时执行,需要排队
过程3和4不能同时执行
前提是a和b需要是全局变量或静态变量,否则每进入方法都实例化一次,虽然名字相同,但是其实不是一个东西
就跟楼上说的,你这个得放到全局变量里面,至于是否需要static,或者说是否可以static,看你实际设计,我就设计过只能绝对不能static的,因为设计中这个类虽然不是单例,但它是被其它单例类包含的,所以只能非static的object
就算这个该为全局的也不行吧!如果 线程1调用Function(1,2)到如下部份
lock (lockThis)
{
c=a+b;
}
但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?
object lockThis = new object ();该为全局
如果 线程1调用Function(1,2)到如下部份
lock (lockThis)
{
c=a+b;
}
但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?
你怎么看
a和b是参数,每次调用时传值进来,两次调用function是不会相互影响的。
你的例子里应该都不需要lock呀。
public int Function(int a,int b)
{
int c;
c=a+b;
return c;
}
应该是不会报错的。
1.首先a和b是参数传递进来的,并不是直接使用a和b的地址
2.对a和b只有取值,没有赋值
3.变量c是个局部变量,两个线程同时执行,并不是同一个c
就算这个该为全局的也不行吧!如果 线程1调用Function(1,2)到如下部份
lock (lockThis)
{
c=a+b;
}
但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?
线程1调用Function 时int 一个c 线程2 调用Function时又int 一个c所以线程1和2是不影响的
{
c=Funtion();//如果Funtion()是外部函数就要lock对不对?
}
{
c=Funtion();//如果Funtion()是外部函数就要lock对不对?
}
我觉得你还是从计算机基础开始学起吧
这跟函数放哪里有任何关系?
{
c=Funtion();//如果Funtion()是外部函数就要lock对不对?
} 锁不锁是看需求的,只有当多线程会有冲突才需要诶; static int c;
static readonly object lockThis =new object();
public void Function(int a,int b)
{
lock (lockThis)
{
c=a+b; // 多线程对一个全局变量做写入操作,此时才会有冲突可能诶
}
}