代码之家  ›  专栏  ›  技术社区  ›  lockedscope L42

访问对象成员和原子性

  •  3
  • lockedscope L42  · 技术社区  · 15 年前
    • 我们从 C# specification 该引用读/写是原子的。在访问对象成员的语句中,引用是否也可以原子访问? 我认为是的,因为它也是一种隐式引用读取,编译器在为其生成代码时必须为其提供原子性。

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

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

    考虑以下代码:

    static SomeClass sharedVar;
    
    void someMethod()
    {
        SomeClass someLocalVar = sharedVar.memberX.memberY.a;
        operations on someLocalVar...
    }
    

    我在找有关这个主题的官方解释,从 MSDN library C规格等,或微软人员,以确保我没有破坏什么东西,一切都很好。

    2 回复  |  直到 15 年前
        1
  •  3
  •   JaredPar    15 年前
    1. 是的,所有引用读取都是原子的。
    2. 在字段读取操作期间,在.ldfld命令完成之前,无法从将值推送到堆栈上的时间收集引用。否则,它将允许CLR收集正在使用的对象。让另一个线程创建该值的实例与此问题无关。
    3. 我不完全确定你最后一点是什么意思,但我认为你太担心垃圾收集了。当您仍在使用某个对象时,CLR将不会删除该对象。
        2
  •  0
  •   thecoop    15 年前

    你太担心GC了。它不会删除将来某个时候您可以引用和访问的任何对象。将只删除完全不可访问的对象。