possível observar um objeto parcialmente construído a partir de outro threa

Ouvi muitas vezes que, no modelo de memória .NET 2.0, as gravações sempre usam cercas de liberação. Isso é verdade? Isso significa que, mesmo sem barreiras ou bloqueios explícitos de memória, é impossível observar um objeto parcialmente construído (considerando apenas os tipos de referência) em um thread diferente daquele em que foi criado? Obviamente, estou excluindo casos em que o construtor vaza othis referência.

Por exemplo, digamos que tivemos o tipo de referência imutável:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

Seria possível, com o código a seguir, observar qualquer saída diferente de "John 20" e "Jack 21", dizer "null 20" ou "Jack 0"?

// We could make this volatile to freshen the read, but I don't want
// to complicate the core of the question.
private Person person;

private void Thread1()
{
    while (true)
    {
        var personCopy = person;

        if (personCopy != null)
            Console.WriteLine(personCopy.Name + " " + personCopy.Age);
    }
}

private void Thread2()
{
    var random = new Random();

    while (true)
    {
        person = random.Next(2) == 0
            ? new Person("John", 20)
            : new Person("Jack", 21);
    }
}

Isso também significa que posso criar todos os campos compartilhados de tipos de referência profundamente imutáveisvolatile e (na maioria dos casos) apenas continuar meu trabalho?

questionAnswers(3)

yourAnswerToTheQuestion