string a="abc";
lock(a){....};在实际使用中我发现锁定的不是a对象,而是以a对象作为标识的{}内的代码块..
但发现资料上是像图中那样说的,是我没理解正确呢还是资料错误?请高手解惑.
using System; using System.Threading; class Program { static void Main(string[] args) { Student s = new Student { Name="yh"}; Thread t=new Thread (new ThreadStart(()=>{lock (s) { Thread.Sleep(100000); }})); t.Start(); Thread.Sleep(1000); Console.WriteLine(s.Name);//这里没有等锁的线程结束才执行..所以我觉得资料说的不对..你们认为呢? Console.ReadKey(); } } internal class Student { public string Name { get; set; } }
看来我上次给你的答案你完全没看,唉,伤心。
看了..没怎么懂啊..
@hexllo: 我说了lock其实就是一个函数调用,lock(a)就是Monitor.TryEnter(a, ref token)这个函数,结果可能有2种,第一种是成功(你可以认为拿到了钥匙),那么就继续执行,另外一种是失败(没拿到钥匙),那么就一直等待(卡在这里)。其他地方什么属性访问,方法调用,只要没有lock,就没有Monitor.TryEnter,就没有“抢钥匙”这种事情,就不会有争抢资源,也不会出现不能访问、不能执行等等事情。
Thread t = new Thread(new ThreadStart(() => { lock (a) { Console.WriteLine("a锁住了," + DateTime.Now); Thread.Sleep(10000); Console.WriteLine("用完了" + DateTime.Now); } })); t.Start(); Thread.Sleep(2000); lock (a) { var b = a + 1; Console.WriteLine("我在用a:" + b + DateTime.Now); }
你这样试试 就是水牛说的。
@hexllo:
如果你在做winform时,你可以试下lock(Form1)会不会有影响?
只有会有公共资源冲突的才会锁,而且一般都是static readonly的锁,具体为什么,书上这么写,我也不太清楚
下面两行代码没有互斥关系:
lock(this) {}
this->Function();
下面两行代码有互斥关系:
lock(this){}
lock(this) {this->Function();}
也就是说,要锁的话,你需要在你需要设置锁的地方都显示的申明:lock(xxxx) { // 被锁定后执行的代码},出此之外的代码不受其它地方lock(xxx)影响。
可以这么想,lock(a) , 以a为标识一把锁,你要锁什么东西,你就得把真个锁都带上,所以你可能会写很多的 lock(a),但是它们都是同一把锁。
我最后再给你一个忠告:请写代码,通过代码来验证你的理解,你应该像编译器一样来思考,而不是纠缠别人写的文字翻译,除非你想给别人找茬。
就是因为实际使用中得到的结果和资料上的不一至才来问的,不然就跟着资料走了,我认为那个资料不对,但不知道是我理解不对还是它本身就不对...你看来呢?
@hexllo: 千万别钻牛角尖。别人那么写,并不表示他的文字能正确表达他的意愿。所以只要你能通过实践理解正确后,能够识别哪些代码能达到什么效果就足够了,没必要非要揪着别人的领口说:你错了!
lock(对象A),其它 线程检查 A的时候,要是同一个A对象时才会互斥,要不然大家怎么都把锁对象声明为 static呢。
lock(this){} //只是对当前实例。
下一个 线程 又new了一个实例,这个this,就不是原来那个。
a 是一个字符串
public static string a = "value";