现在的位置: 主页 > 商讯 > 文章列表

.NET组件程序设计之线程、并发管理(二)

作者:福建省医学会血液病学分会 来源:www.fjhematology.org 发布时间:2017-09-09 10:22:47
 

.NET组件程序设计之线程、并发管理(二) .Net组件程序设计之线程、并发管理(二)

2.同步线程

手动同步

监视器

互斥

可等待事件

同步线程

所有的.NET组件都支持在多线程的环境中运行,可以被多个线程并发访问,如果没有线程同步,这样的后果是当多个线程同时访问 对象状态时,对象的状态可能被破坏,造成不一致性。.NET提供了两种方法来避免这样的问题,使得我们设计的组件更加健壮。 第一种是自动同步,让你使用一个属性来修饰组件,这样就可以把组件交给.NET了,同步的事情也就交给了.NET。 第二种是手动同步,这是让你使用.NET提供的同步对象来实现线程同步,也不是太复杂,本篇将会对手动同步来稍作讲解。

2.1 手动同步

.NET手动同步提供了一套丰富的同步锁,上一节说到同步域,同步域事实上是一个巨大的宏锁,而手动同步则提供了 对被锁对象的细粒度控制,可以控制访问对象、单一成员甚至是单行的代码。这样的好处就是有可能的提高系统的性能和吞吐量。

2.1.1 监视器

监视器是一种只能和引用类型一块工作的锁。

2.1.1-1

复制代码

1 public class ManualSynchronization

2 {

3 public void DoSomeThing()

4 {

5 for (int i = 0; i < 100; i++)

6 {

7 Console.WriteLine(i.ToString());

8 }

9 }

10 }

复制代码

复制代码

1 ManualSynchronization monitorcase = new ManualSynchronization();

2

3 Monitor.Enter(monitorcase);

4 try

5 {

6 monitorcase.DoSomeThing();

7 }

8 finally

9 {

10 Monitor.Exit(monitorcase);

11 }

复制代码

任何线程的任何对象都可以调用Enter()方法来锁定对象,如果Monitor正在被一个线程使用,而这个时候又有一个线程来请求对象Enter(),这样就会使第二个线程阻塞,直到第一个线程调用Exit(),如果这时有多个线程请求对象Enter(),它们就会被放置在一个叫做锁队列的队列里,并依照队列的顺序获得服务顺序。

你还可以使用Monitor类为静态类方法或静态属性提供安全线程访问,方法是让Monitor锁定该类型,而不是一个实例:

2.1.1-2

复制代码

1 public class ManualSynchronization

2 {

3 public static void SDoSomeThing()

4 {

5 for (int i = 0; i < 100; i++)

6 {

7 Console.WriteLine(i.ToString());

8 }

9 }

10 }

复制代码

复制代码

1 Monitor.Enter(typeof(ManualSynchronization));

2 try

3 {

4 ManualSynchronization.SDoSomeThing();

5 }

6 finally

7 {

8 Monitor.Exit(typeof(ManualSynchronization));

9 }

复制代码

在C#中为了简化这样的写法,提供了lock语句,使编译器在try/finally语句中自动产生对Enter()和Exit()的调用。

比如你写下这样的代码等同于2.1.1-1的示例代码:

2.1.1-3

1 ManualSynchronization monitorcase = new ManualSynchronization();

2 lock(monitorcase)

3 {

4 monitorcase.DoSomeThing();

5 }

像上面的代码这样写看似没什么问题了,因为这个lock所定对象实例或者是对象类型,是根据客户端开发者的判断而定的,这样的锁定方式与客户端耦合度大,看下以下代码:

2.1.1-4

复制代码

1 public class ManualSynchronization

2 {

3 public void DoSomeThing()

4 {

5 lock (this)

6 {

7 for (int i = 0; i < 100; i++)

8 {

9 Console.WriteLine(i.ToString());

10 }

11 }

12 }

13 }

复制代码

1 ManualSynchronization monitorcase = new ManualSynchronization();

2 monitorcase.DoSomeThing();

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:恩施SEO http://enshi.4567w.com

  • 上一篇:IOS Using UIAlertView to show alerts
  • 下一篇:最后一页
  •