[MethodImpl(MethodImplOptions.Synchronized)]、lock(this)与lo
对于稍微有点经验的.NET开发人员来说,倘若被问及如何保持线程同步,我想很多人都能说好好几种。在众多的线程同步的可选方式中,加锁无疑是最为常用的。如果仅仅是基于方法级别的线程同步,使用System.Runtime.CompilerServices.MethodImplAttribute无疑是最为简洁的一种方式。MethodImplAttribute可以用于instance method,也可以用于static method。当在某个方法上标注了MethodImplAttribute,并指定MethodImplOptions.Synchronized参数,可以确保在不同线程中运行的该方式以同步的方式运行。我们几天来讨论MethodImplAttribute(MethodImplOptions.Synchronized)和lock的关系。 一、提出结论 在进行讨论之前,我先提出下面3个结论:
二、基于instance method的线程同步 为了验证我们上面提出的结论,我作了一个小小的例子。在一个console application中定义了一个class:SyncHelper,其中定义了一个方法Execute。打印出方法执行的时间,并休眠当前线程模拟一个耗时的操作: 1: class SyncHelper 3: public void Execute() 5: Console.WriteLine("Excute at {0}",DateTime.Now);
7: }
由于Timer对象采用异步的方式进行调用,所以虽然Execute方法的执行时间是5s,但是该方法仍然是每隔1s被执行一次。这一点从最终执行的结果可以看出: 为了让同一个SyncHelper对象的Execute方法同步执行,我们在Execute方法上添加了如下一个MethodImplAttribute: 2: void Execute()
4: Console.WriteLine( 5: Thread.Sleep(5000);
void LockMyself() "Lock myself at {0}",1)" id="lnum7"> 7: Console.WriteLine("Unlock myself at {0}",1)" id="lnum8"> 8: }
3: SyncHelper helper = 4:?
6: delegate()
8:? 10:? 12: thread.Start(); 14: delegate
16: helper.Execute(); 18:? 20: } 结合我们的第二个结论想想最终的输出会是如何。由于LockMyself方法是在另一个线程中执行,我们可以简单讲该方法的执行和Execute的第一个次执行看作是同时的。但是MethodImplAttribute(MethodImplOptions.Synchronized)]果真是通过lock(this)的方式实现的话,Execute必须在等待LockMyself方法执行结束将对自身的锁释放后才能得以执行。也就是说LockMyself和第一次Execute方法的执行应该相差5s。而输出的结果证实了这点: 三、基于static method的线程同步 讨论完再instance method上添加MethodImplAttribute(MethodImplOptions.Synchronized)]的情况,我们相同的方式来讨论倘若一样的MethodImplAttribute被应用到static方法,又会使怎样的结果。 我们先将Execute方法上的MethodImplAttribute注释掉,并将其改为static方法: 6: }
在Main方法中,通过Timer调用该static方法: 6: SyncHelper.Execute();
10: } 毫无疑问,Execute方法将以1s的间隔异步地执行,最终的输出结果如下: 然后我们将对[MethodImpl(MethodImplOptions.Synchronized)]的注释取消: void LockType()
"Lock SyncHelper type at {0}",1)">"Unlock SyncHelper type at {0}",1)" id="lnum9"> 9: } 在Main中,像验证instance method一样,创建新的线程执行LockType方法: 6: SyncHelper.LockType();
8: thread.Start(); 10: Timer timer = 11: 12: { 14: },1)" id="lnum15"> 15:? 17: } 相关内容
推荐文章
站长推荐
热点阅读
|