现在的位置: 首页 > 综合 > 正文

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

2013年03月17日 ⁄ 综合 ⁄ 共 650字 ⁄ 字号 评论关闭

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

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

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

抱歉!评论已关闭.