为什么任何变量只在线程之间共享的静态方法中使用?

时间:2016-11-30 15:08:55

标签: c# multithreading variables methods static

我已经从这个页面或其他页面上读过很多关于这个问题的文章,但仍然找不到真正的答案。根据这些答案,在(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;可变???

我是否必须锁定整个项目中的所有静态方法?那些参数,线程也分享它(我不会显示代码,但我已经测试过了。)

0 个答案:

没有答案