假设我们有一个对象可以被多个线程访问,而一个全局单例可以分发对象的引用,也可以由多个线程访问。
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
都需要线程安全的代码?
答案 0 :(得分:3)
您的类似乎是不可变的并且线程安全。您不需要同步对这些属性的访问,因为它们只能被读取,只需确保只初始化一次单例(Instance
属性),并且不能再次为其分配值。 / p>
答案 1 :(得分:2)
真正需要同步的唯一事情是单例类中的Instance
函数,并且只有在您懒惰地创建实例时才会这样。其余的应该没问题,因为这本书是不变的。
答案 2 :(得分:1)
我同意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#规范所指定的那样(静态初始化程序只执行一次)。 readonly确保这是实例成员设置的唯一时间。
这是单身部分,但现在你在哪里设置BookstoreSingleton的Book成员。你可能需要线程安全,除非你把它放在静态初始化器只调用一次的私有BookstoreSingleton构造函数中。