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

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

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


  • 相关阅读:
    CCF2014123集合竞价(C语言版)
    CCF2016092火车购票
    CCF2013123最大的矩形(C语言版)
    CCF2015122消除类游戏(C语言版)
    CCF2014032窗口(C语言)
    CCF2016093炉石传说(C语言版)
    go module 获取码云私有仓库代码
    centos7 编译安装 redis-6.0.5
    goland2019.2破解方法
    mac下protobuf配置记录
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1396028.html
Copyright © 2011-2022 走看看