C# 访问对象成员和原子性

C# 访问对象成员和原子性,c#,thread-safety,atomicity,C#,Thread Safety,Atomicity,从参考资料中我们知道读/写是原子的。在访问对象成员的语句中,引用是否也会以原子方式访问? 我认为是的,因为它也是一种隐式引用读取,编译器在为其生成代码时必须为其提供原子性 在同一语句中,访问对象以访问其成员是否会导致对象引用保持不变,从而在另一个线程创建新实例时不会对其进行垃圾收集 因此,如果我们访问链中的成员,最左边的对象引用是否也会被保留,这样它就不会被其他线程垃圾收集 考虑以下代码 static SomeClass sharedVar; void someMethod() {

从参考资料中我们知道读/写是原子的。在访问对象成员的语句中,引用是否也会以原子方式访问? 我认为是的,因为它也是一种隐式引用读取,编译器在为其生成代码时必须为其提供原子性

  • 在同一语句中,访问对象以访问其成员是否会导致对象引用保持不变,从而在另一个线程创建新实例时不会对其进行垃圾收集

  • 因此,如果我们访问链中的成员,最左边的对象引用是否也会被保留,这样它就不会被其他线程垃圾收集

  • 考虑以下代码

    static SomeClass sharedVar;
    
    void someMethod()
    {
        SomeClass someLocalVar = sharedVar.memberX.memberY.a;
        operations on someLocalVar...
    }
    
    我正在寻找关于这个主题的官方解释,从,C#specs,等等,或者微软的人,以确保我没有破坏什么东西,一切都很好

  • 是的,所有引用读取都是原子的
  • 在字段读取操作期间,在.ldfld命令完成之前,无法从将值推送到堆栈上的时间收集引用。否则,它将允许CLR收集您正在使用的对象。让另一个线程创建该值的实例与此问题无关
  • 我不完全确定你说的最后一点是什么意思,但我认为你对垃圾收集的担心有点过分了。当您仍在使用对象时,CLR不会删除该对象
    你太担心GC了。它不会删除任何您将来可能引用和访问的对象。只有完全无法访问的对象才会被删除。

    2。我的意思是,如果另一个线程为sharedVar分配了一个新实例,那么在这个线程访问sharedVar时,会释放旧引用。3.我的意思是当线程执行语句SomeClass someLocalVar=sharedVar.memberX.memberY.a的指令时;当memberY被读取时,另一个线程开始工作,并将null或新对象分配给sharedVar。我不认为这封推荐信会被处理,但我只是犹豫了一下,想用官方文件和解释来确定一下?谢谢