是的,目前我对 C# 语言规范和可能破译的教程很感兴趣。我阅读了多个关于线程安全单例类的问题和答案/文章。
以下是我已经探索过的帖子:
我读得越多,我就越沉迷于这些信息。有人可以指导我更好地了解
1)为什么开发人员关心线程安全?
2)如何确定静态类/单例类不是线程安全的?(试用示例代码/示例教程会很棒,因为我喜欢正确学习这些基础知识)
是的,目前我对 C# 语言规范和可能破译的教程很感兴趣。我阅读了多个关于线程安全单例类的问题和答案/文章。
以下是我已经探索过的帖子:
我读得越多,我就越沉迷于这些信息。有人可以指导我更好地了解
1)为什么开发人员关心线程安全?
2)如何确定静态类/单例类不是线程安全的?(试用示例代码/示例教程会很棒,因为我喜欢正确学习这些基础知识)
为什么静态类和单例模式类不是线程安全的?
谁说所有的单例模式类都不是线程安全的?使类线程安全的许多方法
见这里:http ://csharpindepth.com/Articles/General/Singleton.aspx
当您想提高性能时,您会遇到必须使用线程的情况,因此在使您的应用程序线程安全时,您可以避免一些竞争情况。
静态类和单例类将共享应用程序整个实例的值。当您从多个线程访问该对象时,您可以重用或覆盖也被另一个对象使用的变量。这将导致一些非常奇怪的输出,有时很难找到发生了什么,因为在测试用例中模拟它并不容易。您可以在方法中实现 alock
以在这些类中引入线程安全
单例模式有多种版本,有些是线程安全的,有些不是:
您可以阅读 Jon Skeet 关于这些模式的文章。
http://cshapindepth.com/articles/general/singleton.aspx
线程安全对于确保您使用正确的值非常重要。
在下面的示例中,两个线程调用一个方法,这意味着将值 x 设置为 25,如果它是 5,则将它乘以 5。
现在可以出现这样一种情况,主线程在x为5的时候进入if块,开始执行doSomething方法,然后是SecondThread,在x还是5的时候进入if循环,然后主线程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();
}
这不是最好的例子,但我希望它会对你有所帮助。
一般来说,单例模式不是线程安全的,因为每次线程请求实例时,容器都会移交同一个实例。这可能导致多个线程具有相同的实例。
但是有一些方法可以让你的 Singleton 线程安全。