Thread的共享与不共享变量情况

一、不共享变量的线程
1.方法创建变量

class Program {
        static void Main(string[] args) {
            Thread thread = new Thread(go);
            thread.Start();
            go();

        }

        static void go() {
            bool done = false;
            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            }

        }
    }

thread线程开始时会创建done变量;
主线程开始时也会创建done变量;
结果会输出两个Done;

2.本地变量

class Program {
        static void Main(string[] args) {
            bool done = false;
            ThreadDemo threadDemo = new ThreadDemo();
            ParameterizedThreadStart goThread = new ParameterizedThreadStart(threadDemo.go);
            Thread thread = new Thread(goThread);
            thread.Start(done);
            threadDemo.go(done);
        }
    }
    class ThreadDemo{
        public void go(object oneobject) {
            bool done = (bool) oneobject;
            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            }

        }
    }

有一个本地变量done值为fallse。因为线程是调用的是有参数的方法,所以使用ParameterizedThreadStart 进行封装ThreadDemo对象的go方法,把done值传进去,然后主线程在调用threadDemo.go(done)
打印了两次Done

二、线程之间共享的数据
2.如果多个线程引用了同一个对象的实例,那么这些线程会共享这些数据

class Program {
        static void Main(string[] args) {
            BoolDone boolDone = new BoolDone();
            new Thread(boolDone.go).Start();
            boolDone.go();
        }  
    }

 class BoolDone {
        public bool done;
        public BoolDone() {
            done = false;
        }
         public void go() {

            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            }

        }
    }

有一个BoolDone类,有一个布尔类型的done,以及一个go方法
go方法:当done为false的时候,done=true并且打印一个Done;
在main中创建这种类型的变量,然后调用thread线程执行go 方法,
然后主线程也调用go方法。
这时候只会打印一个Done。
即同一个实例的变量在不同的线程间是共享的。

3.当变量为静态变量的时候也会共用

class Program {
        public static bool done = false;
        static void Main(string[] args) {


            new Thread(go).Start();
            go();
        }
        public static void go() {

            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            }

        }
    }

有一个静态变量done。线程thread与主线程都调用go()方法,只打印一个Done

4.被lambda表达式或者匿名方法捕捉到的本地变量。

 class Program {
        static void Main(string[] args) {
            bool done = false;
            ThreadStart action = () =>
          {
              if (!done)
              {
                  done = true;
                  Console.WriteLine("Done");
              }
          };
            new Thread(action).Start();
            action();
        }

这里相当于把done当成同一个实例的变量,从而变成共用的数据。

你可能感兴趣的:(C#语言知识)