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

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

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


  • 相关阅读:
    装饰器模式(学习笔记10)
    软件设计七大原则 (学习笔记2)
    设计模式(学习笔记1)
    桥接模式 (学习笔记9)
    Mini2440裸机开发之LCD基础
    配置中心java客户端实现
    高效CSS写法
    整理电脑里面的前端开发中的小Tips【及时更新】
    IE6 position:fixed (固定定位)的解决方案
    jquery 文档操作
  • 原文地址:https://www.cnblogs.com/xuefeng1982/p/1396028.html
Copyright © 2011-2022 走看看