当前位置:  开发笔记 > 编程语言 > 正文

是否可以在C#中实现作用域锁定?

如何解决《是否可以在C#中实现作用域锁定?》经验,为你挑选了2个好方法。

C++中的一个常见模式是创建一个包装锁的类 - 在创建对象时隐式获取锁,或者在之后显式获取锁.当对象超出范围时,dtor会自动释放锁定.是否可以在C#中执行此操作?据我所知,无法保证C#中的dtor何时在对象超出范围后运行.

澄清:一般锁定,自旋锁,ReaderWriterLock,等等.调用Dispose会破坏模式的目的 - 一旦我们退出范围就释放锁 - 无论我们是否在中间调用return,抛出异常或诸如此类的东西.另外,据我所知,使用仍然只会为GC排队对象,而不是立即销毁它...



1> denis philli..:

为了放大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块之前不会发生异步异常,从而确保释放.



2> Motti..:

您的理解using是不正确的,这是一种以确定的方式进行范围操作的方法(不会排队到GC).

C#提供了lock提供独占锁的关键字,如果你想拥有不同的类型(例如读/写),你将不得不使用该using语句.

PS 此主题可能对您感兴趣.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有