zoukankan      html  css  js  c++  java
  • 谈谈泛型和锁,一个值得注意的问题!

    大家都知道用lock关键字指定的锁定对象必须是引用类型,如果我们这样写:

        class Program
        {
            static void Main(string[] args)
            {
                B b = new B();
                lock (b)  //error
                {
                }          
            }

        }

        struct B
        {
        }

    编译器会直接报错:“ConsoleApplication1.B”不是 lock 语句要求的引用类型 ,这时编译器可以检查到这个问题!

    我们再看下面的代码:

        class Program
        {
            static void Main(string[] args)
            {

                A<B> a = new A<B>(); 

                a.Func();     

            }
        }
        class A<T> where T:new()
        {
            T t = new T();
            public void Func()
            {
                lock (t)
                {
                }
            }
        }
        struct B
        {
        } 

    这段代码可以顺利通过编译,实际上是对B的实例(也就是值类型的实例)加锁,这会导致锁失效,而又不会产生编译错误!

    当需要同步多个线程的时候,这样会导致一些潜在的问题发生!

    希望这个文章可以对大家有帮助!


  • 相关阅读:
    不做男女朋友,做蓝颜吧
    前端 让我尴尬~
    让IE6,IE7,IE8,IE9支持CSS3
    解决chrome不能显示12PX以下字号的字体问题!
    jQuery阻止冒泡和HTML默认操作
    Lazy Load, 延迟加载图片
    解秘微软雅黑
    FLV流媒体应用大攻略
    提升你设计水平的CSS3新技术
    分享下自写的HTML CSS规范
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1396028.html
Copyright © 2011-2022 走看看