2009-11-13 91 views
3
  • 我们从C# specification知道参考读/写是原子的。在访问对象成员的语句中,引用是否也会被原子访问? 我认为是的,因为它也是一种隐式引用读取,编译器在生成代码时必须提供原子性。访问对象成员和原子性

  • 在同一声明中,访问访问它的成员将这项事业的对象的对象引用保持,从而当被另一个线程创建新实例它不是垃圾收集?

  • 所以,如果我们在一个链条访问成员,将参考也将举行最左边的对象,所以它不是垃圾被其他线程收集的?

考虑下面的代码;

static SomeClass sharedVar; 

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

我找这个话题官方的解释,从MSDN library,C#规格等,或微软的人,以确保我不会打破的东西,一切都很好。

回答

3
  1. 是的,所有的参照读数是原子的。
  2. 在字段读取操作期间,从将值压入堆栈的时间开始,直到.ldfld命令完成时才能收集引用。否则,它将允许CLR收集您正在使用的对象。让另一个线程创建该值的实例与此问题无关。
  3. 我不完全确定你最后一点的意思,但我认为你担心垃圾收集太多了。 CLR在您仍在使用时不会移除某个物体。
+0

2.我的意思是,如果另一线程分配一个新的实例来sharedVar所以使虽然这一个正在访问sharedVar设置旧参考。 3.我的意思是当一些点,同时一个线程正在执行的语句的说明 SomeClass的someLocalVar = sharedVar.memberX.memberY.a; 当读取memberY时,另一个线程开始工作,并将null或new对象分配给sharedVar。我不认为参考文献将被处置,但我只是犹豫,并希望让自己确定官方文件,解释? 谢谢。 – lockedscope 2009-11-13 16:34:09

0

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