C++中的一个常见模式是创建一个包装锁的类 - 在创建对象时隐式获取锁,或者在之后显式获取锁.当对象超出范围时,dtor会自动释放锁定.是否可以在C#中执行此操作?据我所知,无法保证C#中的dtor何时在对象超出范围后运行.
澄清:一般锁定,自旋锁,ReaderWriterLock,等等.调用Dispose会破坏模式的目的 - 一旦我们退出范围就释放锁 - 无论我们是否在中间调用return,抛出异常或诸如此类的东西.另外,据我所知,使用仍然只会为GC排队对象,而不是立即销毁它...
为了放大Timothy的答案,lock语句确实使用监视器创建了一个范围锁.从本质上讲,这转化为这样的事情:
lock(_lockKey) { // Code under lock } // is equivalent to this Monitor.Enter(_lockKey) try { // Code under lock } finally { Monitor.Exit(_lockKey) }
在C#中,很少使用dtor作为这种模式(请参阅using语句/ IDisposable).您可能在代码中注意到的一件事是,如果在Monitor.Enter和try之间发生异步异常,则看起来监视器不会被释放.JIT实际上特别保证,如果Monitor.Enter紧接在try块之前,则在try块之前不会发生异步异常,从而确保释放.
您的理解using
是不正确的,这是一种以确定的方式进行范围操作的方法(不会排队到GC).
C#提供了lock
提供独占锁的关键字,如果你想拥有不同的类型(例如读/写),你将不得不使用该using
语句.
PS 此主题可能对您感兴趣.