什么需要线程安全的代码?

时间:2010-08-29 13:29:47

标签: c# .net multithreading locking thread-safety

假设我们有一个对象可以被多个线程访问,而一个全局单例可以分发对象的引用,也可以由多个线程访问。

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.TitleBookstoreSingleton.Book都需要线程安全的代码?

3 个答案:

答案 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构造函数中。