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

<script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

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

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

希望这个文章可以对大家有帮助! <script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值