访问对象成员和原子性

时间:2009-11-13 15:20:10

标签: c# thread-safety atomicity

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

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

  • 因此,如果我们访问链中的成员,是否也会保留最左边的对象引用,以便其他线程不会对其进行垃圾回收?

考虑以下代码;

static SomeClass sharedVar;

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

我正在寻找有关该主题的官方解释,来自MSDN library,C#规格等,或微软人员,以确保我没有破坏某些东西,一切都很好。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

你对GC过分担忧。它不会删除任何可能引用&在将来的某个时间访问。只有完全无法访问的对象才会被删除。