首页 新闻 会员 周边

C# 关于lock关键字的疑惑...高手请进...

0
[已解决问题] 解决于 2012-09-14 17:44

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的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2012-09-14 16:26
< >
分享
最佳答案
0

看来我上次给你的答案你完全没看,唉,伤心。

奖励园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-09-14 16:54

看了..没怎么懂啊..

hexllo | 园豆:318 (菜鸟二级) | 2012-09-14 16:56

@hexllo: 我说了lock其实就是一个函数调用,lock(a)就是Monitor.TryEnter(a, ref token)这个函数,结果可能有2种,第一种是成功(你可以认为拿到了钥匙),那么就继续执行,另外一种是失败(没拿到钥匙),那么就一直等待(卡在这里)。其他地方什么属性访问,方法调用,只要没有lock,就没有Monitor.TryEnter,就没有“抢钥匙”这种事情,就不会有争抢资源,也不会出现不能访问、不能执行等等事情。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-09-14 17:06
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: 

telang | 园豆:646 (小虾三级) | 2012-09-14 17:28
其他回答(4)
0

如果你在做winform时,你可以试下lock(Form1)会不会有影响?

空明流光 | 园豆:106 (初学一级) | 2012-09-14 16:33

只有会有公共资源冲突的才会锁,而且一般都是static readonly的锁,具体为什么,书上这么写,我也不太清楚

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2012-09-14 16:34
0

下面两行代码没有互斥关系:

lock(this) {}

this->Function();

下面两行代码有互斥关系:

lock(this){}

lock(this) {this->Function();}

 

也就是说,要锁的话,你需要在你需要设置锁的地方都显示的申明:lock(xxxx) { // 被锁定后执行的代码},出此之外的代码不受其它地方lock(xxx)影响。

可以这么想,lock(a) , 以a为标识一把锁,你要锁什么东西,你就得把真个锁都带上,所以你可能会写很多的 lock(a),但是它们都是同一把锁。

 

我最后再给你一个忠告:请写代码,通过代码来验证你的理解,你应该像编译器一样来思考,而不是纠缠别人写的文字翻译,除非你想给别人找茬。

Launcher | 园豆:45045 (高人七级) | 2012-09-14 16:35

就是因为实际使用中得到的结果和资料上的不一至才来问的,不然就跟着资料走了,我认为那个资料不对,但不知道是我理解不对还是它本身就不对...你看来呢?

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2012-09-14 16:42

@hexllo: 千万别钻牛角尖。别人那么写,并不表示他的文字能正确表达他的意愿。所以只要你能通过实践理解正确后,能够识别哪些代码能达到什么效果就足够了,没必要非要揪着别人的领口说:你错了!

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2012-09-14 17:02
0

lock(对象A),其它 线程检查 A的时候,要是同一个A对象时才会互斥,要不然大家怎么都把锁对象声明为 static呢。

lock(this){} //只是对当前实例。

下一个 线程 又new了一个实例,这个this,就不是原来那个。

Qlin | 园豆:2403 (老鸟四级) | 2012-09-14 16:46
0

a 是一个字符串

public static string a = "value";
telang | 园豆:646 (小虾三级) | 2012-09-14 17:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册