• 谈谈泛型和锁,一个值得注意的问题!


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

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

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


  • 相关阅读:
    java面向对象4-多态
    机器学习降维--SVD奇异值分解
    hive中的null
    熵(二)-交叉熵与相对熵
    指数家族-Beta分布
    指数族函数
    java面向对象3-继承(继承、抽象类、抽象接口)
    网页自动刷新
    spring +hibernate 启动优化【转】
    svn is already locked解决方案
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1396028.html
Copyright © 2020-2023  润新知