Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能否将线程安全对象定义为只读变量?_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 能否将线程安全对象定义为只读变量?

C# 能否将线程安全对象定义为只读变量?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我可以像下面这样定义lockObject吗 private readonly object lockObject; 或者应该像这样被玷污: private object lockObject; 99.99%的时间使用只读 传统上,您希望使用只读对象作为锁,原因是在变量lockObject处对对象进行锁定。如果您不将其设置为只读,并且它会发生更改,则可能会出现多个线程将锁放置在不同对象上的情况 下面是一个关于senario的很好的列表说明,它可能会在不使用只读锁的情况下导致问题 线程A在loc

我可以像下面这样定义lockObject吗

private readonly object lockObject;
或者应该像这样被玷污:

private object lockObject;

99.99%的时间使用只读

传统上,您希望使用只读对象作为锁,原因是在变量
lockObject
处对对象进行锁定。如果您不将其设置为只读,并且它会发生更改,则可能会出现多个线程将锁放置在不同对象上的情况

下面是一个关于senario的很好的列表说明,它可能会在不使用只读锁的情况下导致问题

  • 线程A在
    lockObject
  • 线程B在
    lockObject
  • 线程C在
    lockObject
    处获取锁,这与步骤1中的锁不同
  • 在0.01%的时间内


    这将是因为某些原因,你想要改变你的锁,也就是说,你控制访问的资源被改变了,但是可能还有线程在前一个资源上工作,你认为它们当前的操作对你的程序仍然有效,你不想等待他们改变锁。strong>同样,这是警告,您可能不应该这样做

    99.99%的时间使用只读

    传统上,您希望使用只读对象作为锁,原因是在变量
    lockObject
    处对对象进行锁定。如果您不将其设置为只读,并且它会发生更改,则可能会出现多个线程将锁放置在不同对象上的情况

    下面是一个关于senario的很好的列表说明,它可能会在不使用只读锁的情况下导致问题

  • 线程A在
    lockObject
  • 线程B在
    lockObject
  • 线程C在
    lockObject
    处获取锁,这与步骤1中的锁不同
  • 在0.01%的时间内


    这将是因为某些原因,你想要改变你的锁,也就是说,你控制访问的资源被改变了,但是可能还有线程在前一个资源上工作,你认为它们当前的操作对你的程序仍然有效,你不想等待他们改变锁。strong>同样,这也伴随着警告,如果在初始化后不需要写入字段,则可能不应该这样做

    ,然后将其定义为只读。锁定对象是一个不应该改变的东西的好例子。@GlorinOakenfoot谢谢,但是.net framework需要写入锁定对象吗?但是您需要创建对象。通常您会写:
    private readonly object lockObject=new object()
    @Fred No.
    lock
    指令(以及通常的
    监视器。输入
    /
    监视器。退出
    “实现”
    )在一个连接到
    对象的特殊表中使用一些元数据。这里,它解释了在Microsoft.NET中
    写入一些“隐藏”锁定对象的前置内存:如果初始化后不需要写入字段,则将其定义为只读。锁定对象是一个不应该改变的东西的好例子。@GlorinOakenfoot谢谢,但是.net framework需要写入锁定对象吗?但是您需要创建对象。通常您会写:
    private readonly object lockObject=new object()
    @Fred No.
    lock
    指令(以及通常的
    监视器。输入
    /
    监视器。退出
    “实现”
    )在一个连接到
    对象的特殊表中使用一些元数据。这里,它解释了在Microsoft.NET中
    写入一些“隐藏”锁定对象的前置内存: