Для чего нужен потокобезопасный код? - PullRequest
1 голос
/ 29 августа 2010

Допустим, у нас есть объект, к которому могут обращаться несколько потоков, и глобальный одноэлемент, раздающий ссылку на объект, также доступный нескольким потокам.

class Book {
    private string title;
    public Book(string title) {
        this.title = title;
    }

    public string Title { get { return title; } }
}

class BookstoreSingleton {

    public BookstoreSingleton Instance { ... }

    public Book Book { get { return this.book; } }
}

Правильно ли я считаю, что оба, Book.Title и BookstoreSingleton.Book оба нуждаются в поточно-ориентированном коде?

Ответы [ 3 ]

3 голосов
/ 29 августа 2010

Ваш класс кажется неизменным и безопасным для потоков. Вам не нужно синхронизировать доступ к этим свойствам, поскольку они могут быть прочитаны, просто убедитесь, что вы инициализируете свой синглтон только один раз (свойство Instance) и не можете присвоить ему значение во второй раз.

2 голосов
/ 29 августа 2010

Единственная вещь, которая действительно нуждается в синхронизации - это функция Instance в классе singleton, и только тогда, когда вы создаете свой экземпляр лениво. Остальное должно быть в порядке, поскольку книга неизменна.

1 голос
/ 29 августа 2010

Я согласен с cHao.

Классический способ сделать это - включить

public class BookstoreSingleton {

    private static readonly BookstoreSingleton instance = new BookstoreSingleton()
    public BookstoreSingleton Instance { return instance; }

    public Book Book { get { return this.book; } }
}

как член класса BookstoreSingleton. Не ленивый, как было бы, если бы Instance был единственным статическим членом, он отлично справился бы с работой и был совершенно безопасен для потоков, как указано в спецификациях c # (статический инициализатор выполняется только один раз) Только для чтения убедитесь, что это единственный раз, когда будет установлен элемент экземпляра.

Это для одиночной части, но теперь, где вы устанавливаете члена BookstoreSingleton's Book. Возможно, вам нужна безопасность потоков, за исключением случаев, когда вы помещаете его в закрытый конструктор BookstoreSingleton, который статический инициализатор вызывает только один раз.

...