我已经从这个页面或其他页面上读过很多关于这个问题的文章,但仍然找不到真正的答案。根据这些答案,在(static / instance)方法中创建的所有变量都应该是线程安全的。不幸的是,这不能正常工作。
我有这段代码:
public static void TestThreadSafetyOfInsideVariableOfStaticMethod()
{
Thread t1 = new Thread(staticClass.Test) { Name = "t1" };
Thread t2 = new Thread(staticClass.Test) { Name = "t2" };
Thread t3 = new Thread(staticClass.Test) { Name = "t3" };
Thread t4 = new Thread(staticClass.Test) { Name = "t4" };
t1.Start(); t2.Start(); t3.Start(); t4.Start();
}
public static class staticClass
{
public static void Test()
{
for (int i = 1; i < 11; i++)
{
FileStream fs = new FileStream("C:\\test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
byte[] bytesToWrite = Encoding.UTF8.GetBytes(Thread.CurrentThread.Name + " is currently writing its line " + i + ".\r\n");
fs.Write(bytesToWrite, 0, bytesToWrite.Length);
fs.Close();
fs.Dispose();
Thread.Sleep(500);
}
}
}
当我运行TestThreadSafetyOfInsideVariableOfStaticMethod时,文本文件中的输出是:
t2目前正在编写其第1行
t3目前正在编写其第1行
t4目前正在写它的第1行
t1目前正在写它的第2行
t2目前正在编写其第2行
t4目前正在写它的第2行
t2目前正在编写第3行
t1目前正在编写第3行
t4目前正在编写第3行
t4目前正在编写第4行
t4目前正在编写其第5行
t1目前正在编写其第6行
t1目前正在编写其第7行
t1目前正在编写其第8行
t2目前正在编写第9行
t1目前正在编写第9行
t3目前正在编写第9行
t4目前正在编写其第10行
- 文件的结尾。
我希望每个线程都会在自己的for循环中编写自己的行,所以40行,不共享&#34; i&#34;方法内的for循环中的变量。为什么他们分享这个&#34;我&#34;可变???
我是否必须锁定整个项目中的所有静态方法?那些参数,线程也分享它(我不会显示代码,但我已经测试过了。)