zoukankan      html  css  js  c++  java
  • 关于 MSDN 说 Lock 应该用private 对象锁定的测试。

    MSDN 说:
    lock
    关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit

    通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)lock (typeof (MyType))lock ("myLock") 违反此准则:

    • 如果实例可以被公共访问,将出现 lock (this) 问题。

    • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

    • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

    最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。


    Test

    class Program
    {
    private object obj = new object();

    public void T()
    {
    lock (obj)
    {
    Console.Write(
    "Enter");
    lock (obj)
    {
    }
    Thread.Sleep(
    100);
    Console.WriteLine(
    " OK!");
    }
    }
    static void Main(string[] args)
    {
    var p
    = new Program();
    ThreadStart ts
    = new ThreadStart(p.T);

    for (int i = 0; i < 10; i++)
    {
    Thread th
    = new Thread(ts);
    th.Start();
    }
    }
    }

    实例会超出控制范围? 第二个 lock 之后, obj 就超出范围了吧,其实不然,第一个lock 依然是阻塞状态。

    无论 obj 字符串,还是 typeof(Program),结果都一样。 不明白MSDN说的是为什么。


    alarm   作者:NewSea     出处:http://newsea.cnblogs.com/    QQ,MSN:iamnewsea@hotmail.com

      如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    mogodb优化
    uuid
    ssl详解
    探究rh6上mysql5.6的主从、半同步、GTID多线程、SSL认证主从复制
    CMAKE MYSQL
    证书生成
    叶金荣主页
    mysqlslap
    sysbench 测试MYSQL
    mysql实验室
  • 原文地址:https://www.cnblogs.com/newsea/p/1808085.html
Copyright © 2011-2022 走看看