c# - lock() 在同一个对象上我试图独占访问或使用单独的锁定对象?

标签 c# .net multithreading thread-safety locking

private class MyClass
{
    private static MyObject myObject = new MyObject();

    private void ModifyObject()
    {
        lock(myObject)
        {
            myObject.UnsafeMethod();
        }
    }
}

可以锁定 myObject 还是必须声明另一个专用锁定对象?

最佳答案

没关系,任何对象都足以充当存储锁状态的地方。

然而,这在任何代码审查中都是一个强烈的危险信号,暗示程序员正在以错误的方式考虑锁。在 .NET 中没有“锁定对象以使其线程安全”这样的事情。这个概念确实存在,许多学术研究的主题,称为 STM 或软件事务内存。但在 .NET 框架中对此没有丝毫支持。

您使用锁来阻止代码。可以由多个线程执行并读取或写入变量的危险代码。通常不止一个地方,代码存在于源代码文件的特定 地方。您使用锁来确保只有 一个 线程可以同时执行这些特定位置的代码。因此,锁定状态与代码段相关联,而不是对象。因此应该需要一个专用对象来存储那些特定部分的锁定状态。通过拥有这样一个专门的对象,您可以表明您知道自己在做什么,而不是仅仅挑选一个放在身边的对象。还具有强大的 self 记录功能,因此您只需搜索锁定变量的名称,就可以更轻松地查看发生锁定的位置。

关于c# - lock() 在同一个对象上我试图独占访问或使用单独的锁定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457632/

相关文章:

.net - 从youtube链接获取youtube嵌入视频代码?

java - 将多个 ByteArrayOutputStream 合并为一个 FileOutputStream

c++ - 独立于消耗原子负载的变量对操作有什么影响吗?

c# - 如何在另一个类(class)中使用一个类(class)的公共(public) boolean ? C#

c# - 在 LINQ 中通过子属性排序父对象

c# - 我可以将 WCF Web 服务限制为仅来自特定域的调用吗?

c - 双链表 - 内存损坏

c# - 从 .Net 调用 native 函数时参数值困惑

javascript - 使用 JS 禁用控件

.net - ClickOnce升级失败,System.Deployment.Internal.Isolation.StoreTransactionOperationType(27)-HRESULT:0x8007001f