是的,目前我正在接受C#语言规范以及可能的可解读教程。我读了很多关于线程安全的单例类的问题和答案/文章。
以下是我已经探讨过的帖子:
我阅读的越多,我就越被淹没了这些信息。有人可以指导我更好地理解
1)为什么开发人员关心线程安全?
2)静态类/单例类如何被确定为不是线程安全的? (试用的示例代码/示例教程很棒,因为我喜欢正确地学习这些基础知识)
答案 0 :(得分:1)
为什么静态类和单例模式类不是线程安全的?
谁说所有单例模式类都不是线程安全的?有很多方法可以使类线程安全
见这里:http://csharpindepth.com/Articles/General/Singleton.aspx
答案 1 :(得分:1)
当你想提高你的表现时,你会遇到必须使用线程的情况,因此在使你的应用程序线程安全时你可以避免一些竞争情况。
Static和Singleton类将共享整个应用程序实例的值。从多个线程访问该对象时,您可以重用或覆盖另一个对象也在使用的变量。这将导致一些非常奇怪的输出,有时很难找到正在发生的事情,因为它很容易在测试用例中模拟这一点。您可以在您的方法中实现lock
以在这些类中引入线程安全性
答案 2 :(得分:1)
Singleton Pattern有各种版本,有些是线程安全的,有些则不是:
你可以阅读Jon Skeet关于这些模式的文章。
http://csharpindepth.com/articles/general/singleton.aspx
线程安全对于确保您正在玩正确的值非常重要。
在下面的示例中,两个线程调用一个方法,这意味着如果将值x设置为5,则将值x设置为25。
现在可能有一个场景,主线程进入if块,而x是5,并开始执行doSomething方法,然后是SecondThread,进入if循环,而x仍然是5.然后主线程A将修改x到25,然后SecondThread将其修改为125。
所以这里我们需要某种同步,以便不超过一个线程可以同时修改x。
private int x = 5;
private void dosomething()
{
}
private void multXby5if5() // Should make x =25, by multiplying 5 if it was 5, finally x should be 25
{
if (x == 5) // State A: SecondThread reaches here while x is still 5
{
dosomething(); //State A : Main thread reaches here
x = x*5; // State B: Then Main Thread comes and makes x =25, then later SecondThread will come make x*5=25*5=125,
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread tr = new Thread(multXby5if5);
tr.Name = "SecondThread";
multXby5if5();
tr.Start();
}
这不是最好的例子,但我希望它会对你有帮助。
答案 3 :(得分:0)
一般来说,单例模式不是线程安全的,因为每次线程请求实例时,容器都会移交同一个实例。这可能导致多个线程具有相同的实例。
但是有一些方法可以使您的Singleton线程安全。