【问题标题】:Accessing object members and atomicity访问对象成员和原子性
【发布时间】:2010-12-16 08:05:35
【问题描述】:
  • 我们从C# specification 知道引用读/写是原子的。在访问对象成员的语句中,引用也会被原子访问吗? 我认为是的,因为它也是一种隐式引用读取,编译器在为其生成代码时必须为其提供原子性。

  • 在同一语句中,访问对象以访问其成员会导致对象引用被持有,因此在另一个线程创建新实例时不会被垃圾回收?

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

考虑以下代码;

static SomeClass sharedVar;

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

我正在寻找有关该主题的官方解释,来自 MSDN library、C# 规范等或 Microsoft 人员,以确保我没有破坏某些东西并且一切正常。

【问题讨论】:

    标签: c# thread-safety atomic


    【解决方案1】:

    你对 GC 太担心了。它不会删除您将来可能引用和访问的任何对象。只有完全无法访问的对象才会被移除。

    【讨论】:

      【解决方案2】:
      1. 是的,所有参考读取都是原子的。
      2. 在字段读取操作期间,从将值压入堆栈直到 .ldfld 命令完成为止,无法收集引用。否则它将允许 CLR 收集您正在使用的对象。让另一个线程创建该值的实例与此问题无关。
      3. 我不完全确定您所说的最后一点是什么意思,但我认为您对垃圾收集的担忧有点过头了。当您仍在使用对象时,CLR 不会删除它。

      【讨论】:

      • 2.我的意思是,如果另一个线程将一个新实例分配给 sharedVar,那么会导致旧引用在该引用访问 sharedVar 时被释放。 3. 我的意思是当一个线程正在执行语句 SomeClass someLocalVar = sharedVar.memberX.memberY.a 的指令时的某个时刻;当 memberY 被读取时,另一个线程开始行动并将 null 或新对象分配给 sharedVar。我不认为参考资料会被处理,但我只是犹豫了一下,想用官方文件、解释来确定自己?谢谢。
      猜你喜欢
      • 2012-07-12
      • 2011-04-07
      • 2020-08-18
      • 2013-02-19
      • 1970-01-01
      • 2014-05-27
      • 2012-07-07
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多