Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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#_Locking - Fatal编程技术网

C# 我可以锁定类实例变量的副本吗?

C# 我可以锁定类实例变量的副本吗?,c#,locking,C#,Locking,在C#中,类实例是引用类型。这是否意味着可以锁定new返回的值的副本?在我的例子中,我有一个类,其中包含一些需要锁定的字段: class Foo { // ... private Dictionary<IAsyncResult, string> fReadRequests; private Dictionary<IAsyncResult, string> fWriteRequests; private Dictionary<IAsyn

在C#中,类实例是引用类型。这是否意味着可以锁定
new
返回的值的副本?在我的例子中,我有一个类,其中包含一些需要锁定的字段:

class Foo {
    // ...
    private Dictionary<IAsyncResult, string> fReadRequests;
    private Dictionary<IAsyncResult, string> fWriteRequests;
    private Dictionary<IAsyncResult, string> fSyncRequests;
}

这安全吗?即使应用锁的变量是原始变量的副本,锁是否也能按预期工作?

是的,您从未锁定保存引用的变量,而是始终锁定实例

在本例中,您复制的是引用,而不是对象,因此这些字段中的对象与您正在处理的对象相同

锁定这些应该很好

只要知道:

  • 锁定对象不会以任何方式阻止其他线程访问同一对象。如果另一个线程没有锁定,它将直接跳进并更改对象,而不会被锁定
  • 不要锁定您不拥有的对象以及您发布给其他人的对象。您需要确保您的代码是唯一锁定该对象的代码,否则,如果其他代码也锁定了该对象,您谨慎的同步代码可能会突然停止
  • 永远不要锁定值类型,即使在
    对象
    变量中有它们。每次将值类型复制到
    对象
    变量时,都会得到一个新的副本,该副本将有自己的锁
  • 抵消丁腈橡胶。2您通常会这样做:

    private readonly object fLockReadQuests = new object();
    
    然后锁定它


    但同样,你在问题中的假设成立。

    是的,你从来没有锁定保存引用的变量,你总是锁定实例

    在本例中,您复制的是引用,而不是对象,因此这些字段中的对象与您正在处理的对象相同

    锁定这些应该很好

    只要知道:

  • 锁定对象不会以任何方式阻止其他线程访问同一对象。如果另一个线程没有锁定,它将直接跳进并更改对象,而不会被锁定
  • 不要锁定您不拥有的对象以及您发布给其他人的对象。您需要确保您的代码是唯一锁定该对象的代码,否则,如果其他代码也锁定了该对象,您谨慎的同步代码可能会突然停止
  • 永远不要锁定值类型,即使在
    对象
    变量中有它们。每次将值类型复制到
    对象
    变量时,都会得到一个新的副本,该副本将有自己的锁
  • 抵消丁腈橡胶。2您通常会这样做:

    private readonly object fLockReadQuests = new object();
    
    然后锁定它


    但同样,您在问题中的假设成立。

    不确定这是否是您的意思,但存储在
    reqDict
    中的
    词典不会是词典的副本,它将是对原始词典的引用,所以它的工作原理和您为每个词典复制代码的工作原理相同。简言之,是的,你的锁应该很好用@T.Kiley-所以引用(不是实例)是一个副本。不确定这是否是您的意思,但存储在
    reqDict
    中的
    字典不会是字典的副本,它将是对原始字典的引用,所以它的工作原理和您为每个字典复制代码一样。简言之,是的,你的锁应该很好用@T.Kiley-所以参考(不是实例)是一个副本。谢谢。这是一个在C#比我在这里寻找的时间更长的人给我的安慰,你提供了这一点。谢谢。这是一个在C#比我在这里寻找的时间更长的人给我的安慰,而你正好提供了这一点。