try-finally结构中空try块的作用是什么?结合ConcurrentBag代码解析
关于ConcurrentBag中
try { } finally写法的解释 先明确这段代码的前置场景:在它之前肯定已经通过Monitor.Enter(list, ref lockTaken)成功获取了锁,此时lockTaken的值为true。
为什么要用空try块+finally?
这种写法和直接执行finally里的代码完全不等价,核心原因是利用了finally块的强制执行特性:
- 不管try块内有没有代码、有没有抛出异常,finally块里的逻辑都会被执行。
- 如果直接写
lockTaken = false; Monitor.Exit(list);,一旦这段代码之前的业务逻辑抛出异常,这两行释放锁的代码根本不会被执行,锁会一直被当前线程持有,进而引发死锁问题。
代码里的细节作用
lockTaken = false:重置标记,避免外层如果还有另一个try-finally结构(根据lockTaken判断是否释放锁)时,重复调用Monitor.Exit——因为Monitor.Exit必须由持有锁的线程调用,且调用次数要和Monitor.Enter严格匹配,重复调用会抛出异常。Monitor.Exit(list):确保锁被释放,让其他线程可以访问被锁定的资源。
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

