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原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    深拷贝呀,浅拷贝,再来一次复习整理
    移动端适配之路的一步步了解
    回文数
    整数反转
    关于DOM事件篇收集的知识点
    Html5新增的属性-querySelector
    Java常用的集合类
    VerifyCodeServlet(一次性验证码)
    EncodingFilter
    BaseServlet(一个Servlet多个处理方法)
  • 原文地址:https://www.cnblogs.com/newsea/p/1808085.html
Copyright © 2011-2022 走看看