2012-03-09 2 views
1

Учитывая следующий сценарий, используя C#:.NET сборщик мусора «состояние гонки»

Someclass lInstance = new SomeClass(); 
System.WeakReference lWInstance = new System.WeakReference(lInstance); 

lInstance = null; 

System.GC.Collect(); 
System.GC.SuppressFinalize(lWInstance.Target); 

Представьте себе, что когда SuppressFinalize выполняет АЯ нить уже внутри Finalizer коды SomeClass.

Вопрос в том, что произойдет? Я предполагаю, что после того, как поток GC вступил в финализатор, подавляя его, он не влияет.

+0

Что случилось, когда вы попробовали? Я предполагаю, что иногда финализатор выполняется, а иногда нет. – dtb

+0

System.GC.Collect() не гарантирует ничего. Он может просто запланировать сбор. Я предполагаю, что после завершения финализации он не будет остановлен, если у него нет дополнительных проверок. – CodingBarfield

+0

Зачем вам все это? 'SuppressFinalize' должна быть оптимизацией производительности, не более того. – CodesInChaos

ответ

1

Я бы ожидал, что lWInstance.Target будет пустым, если выполнялся финализатор lInstance. То есть что WeakReference вернет ссылку только на действительную неконфигурированную цель.

+0

+1. Это невозможное состояние гонки. Если метод SuppressFinalize обрабатывает цель, существует неявная ссылка active -> ergo no finalization. – TomTom

+0

Это будет правда *, если финализатор не повторил ссылку *. – Joshua

Смежные вопросы