在.net面向对象程序设计阶段在线程资源共享中的线程安全和线程冲突的解决方案;多线程同步,使用线程锁和线程通知实现线程同步,具体内容介绍如下:
1、 ThreadStatic特性
特性:[ThreadStatic]
功能:指定静态字段在不同线程中拥有不同的值
在此之前,我们先看一个多线程的示例:
我们定义一个静态字段:
static int num = 0;
然后创建两个线程进行分别累加:
- new Thread(() =>
- {
- for (int i = 0; i < 1000000; i++)
- ++num;
- Console.WriteLine("来自{0}:{1}", Thread.CurrentThread.Name, num);
- })
- { Name = "线程一" }.Start();
- new Thread(() =>
- {
- for (int i = 0; i < 2000000; i++)
- ++num;
- Console.WriteLine("来自{0}:{1}", Thread.CurrentThread.Name, num);
- })
- { Name = "线程二" }.Start();
运行多次结果如下:
可以看到,三次的运行结果均不相同,产生这种问题的原因是多线程中同步共享问题导致的,即是多个线程同时共享了一个资源。如何解决上述问题,最简单的方法就是使用静态字段的ThreadStatic特性。
在定义静态字段时,加上[ThreadStatic]特性,如下:
不论运行多少次,结果都是一样的,当字段被ThreadStatic特性修饰后,它的值在每个线程中都是不同的,即每个线程对static字段都会重新分配内存空间,就当然于一次new操作,这样一来,由于static字段所产生的问题也就没有了。
2. 资源共享
多线程的资源共享,也就是多线程同步(即资源同步),需要注意的是线程同步指的是线程所访问的资源同步,并非是线程本身的同步。
在实际使用多线程的过程中,并非都是各个线程访问不同的资源。
下面看一个线程示例,假如我们并不知道线程要多久完成,我们等待一个固定的时间(假如是500毫秒):
先定义一个静态字段:
static int result;
创建线程:
- Thread myThread = new Thread(() =>
- {
- Thread.Sleep(1000);
- result = 100;
- });
- myThread.Start();
- Thread.Sleep(500);
- Console.WriteLine(result);
新闻热点
疑难解答
图片精选