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的实例(也就是值类型的实例)加锁,这会导致锁失效,而又不会产生编译错误!

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

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


  • 相关阅读:
    SPOJ1043 GSS1(线段树)
    cf1028C. Rectangles(前缀和)
    cf559C. Gerald and Giant Chess(容斥原理)
    五校联考解题报告
    BZOJ1853: [Scoi2010]幸运数字(容斥原理)
    使用spring-amqp结合使用rabbitmq
    instanceof关键字
    qml学习:对象和属性
    [置顶] 推荐12款很棒的HTML5开发框架和开发工具
    linux系统开机过程描述
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1396028.html
Copyright © 2011-2022 走看看