Можно ли наблюдать частично- объект, созданный из другого потока?

Я часто слышал, что в модели памяти .NET 2.0 при записи всегда используются ограничения выпуска.Это правда? Означает ли это, что даже без явных барьеров или блокировок памяти невозможно наблюдать частично сконструированный объект (с учетом только ссылочных типов) в потоке, отличном от того, в котором он создан? Я, очевидно, исключаю случаи, когда конструктор пропускает ссылку this .

Например, предположим, что у нас есть неизменяемый ссылочный тип:

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;
    }
}

Можно ли с помощью следующего кода наблюдать за любым выводом, кроме «John 20» и «Jack 21», скажем «null 20» или «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);
    }
}

Означает ли это, что я могу сделать все общие поля глубоко неизменяемых ссылочных типов изменчивыми и (в большинстве случаев) просто продолжать свою работу?

27
задан Yuck 2 December 2011 в 15:43
поделиться