多线程编程,有时希望每个线程的数据相互隔离互不影响,有时却希望线程间能共享数据,并保持同步。本篇体验多线程共享和不共享数据。
□ 多线程不共享数据
对于多线程,CLR到底是怎样为它们分配内存栈空间呢?是"一个萝卜一个坑",每个线程都有自己的栈空间;还是"大树底下好乘凉",所有的线程共享同一个栈空间?
我们让2个线程执行相同的静态方法,用到相同的变量,通过打印变量来求证多线程栈空间的分配情况。
class PRogram{static void Main(string[] args){new Thread(SayHi).Start();SayHi();}static void SayHi(){for (int i = 0; i < 5; i++){Console.WriteLine("我是线程#" + Thread.CurrentThread.ManagedThreadId + "这是我的第" +i+ "次说hello");}}}
虽然2个线程交叉执行,但都说了4次的hello。说明CLR为2个线程都分配了栈空间,变量i在各自的栈空间中相互不受影响。
□ 多线程共享数据
线程间是需要相互合作的,多个线程如何共享数据呢?
※ 共享实例变量
让2个线程执行同一个实例方法,看看是否可以共享对象实例的公共字段。
using System;using System.Threading;namespace Consoleapplication1{class Program{public int whatever;static void Main(string[] args){Program p = new Program();new Thread(p.PrintVariable).Start();p.PrintVariable();}void PrintVariable(){whatever++;
新闻热点
疑难解答