多线程成员变量与静态变量,它们在多线程中的工作方式有何不同?

时间:2018-03-05 02:44:41

标签: c# multithreading

我对成员变量和静态变量进行了快速测试,我发现了一个有趣的结果,如果变量是静态对象的成员变量,即使在线程赛车上下文中总是正确计算,但如果是变量静态变量,它会碰到问题。

例如: enter image description here

enter image description here

class Program
{

    static void Main(string[] args)
    {
        var locker = new object();
        ThreadPool.SetMaxThreads(64, 64);
        var numOfThreads = 64;


        WaitHandle[] waitHandles = new WaitHandle[numOfThreads];

        var sw = new Stopwatch();
        sw.Start();
        for (long i = 0; i < numOfThreads; i++)
        {
            var handle = new EventWaitHandle(false, EventResetMode.ManualReset);
            waitHandles[i] = handle;
            ThreadPool.QueueUserWorkItem((state) =>
            {

                obj.run();
                ((EventWaitHandle)handle).Set();
            }, handle);
            //obj.run();
        }
        WaitHandle.WaitAll(waitHandles);
        sw.Stop();


        Console.WriteLine($"Exit Performance test {sw.ElapsedMilliseconds} output: {obj.x}");
        Console.ReadKey();
    }
    static MyClass obj = new MyClass();
}

class MyClass
{
    private object locker = new object();
    //public static int x = 0;
    public int x = 0;
    public void run() {
        //lock (locker)
        {
            for (int j = 0; j < 10000000; j++)
            {
                x = x + 1;
            }

            Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, count of loop: {x}");
        }
        var f = 0;
        Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$start: {f}");
        for (int j = 0; j < 10000000; j++)
        {
            f = f + 1;
        }
        Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$end: {f}");

    }
}

由于我理解静态对象及其成员字段在多线程共享的内存中有1个实例副本,因此它应该与使用静态varialbe相同,但不知何故它的行为方式不同。

问题: 1.多线程中静态字段和成员字段之间的区别是什么? 2.这是否意味着静态字段的运行速度比成员字段快?

谢谢!

1 个答案:

答案 0 :(得分:-1)

  1. 多线程中静态字段和成员字段之间的区别是什么? 我发现小循环成员字段几乎没有遇到多线程赛车问题,但是对于大循环10000000,它们都遇到赛车问题,因此两者都需要更衣柜。

  2. 这是否意味着静态字段的运行速度比成员字段快? 我发现使用储物柜比没有储物柜更快写入共享资源。