CLR Via C#读书笔记——Monitor类同步线程【2011-02-10】

来源:互联网 发布:java排序算法面试题 编辑:程序博客网 时间:2024/05/21 01:54

为了对同步块加锁或解锁,我们需要调用System.Threading.Monitor类中定义的静态方法。调用下面的方法可以对对象的同步块加锁:

static void Enter(Object obj);

调用这个方法时,该方法首先检查指定对象的同步块的索引是否为负值,如果是负值,那么方法就找到一个空闲的同步块,然后方法将该同步块的索引记录到对象的同步块索引中。顺便说一下,CLR拥有一个线程安全的方式来查找空闲的同步块并将其与对象关联。一旦同步块与对象关联,Monitor.Enter方法就会检查指定对象的同步块,看是否有另一个线程拥有该同步块。如果该同步块当前没有被其他线程拥有,那么调用线程将拥有这个同步块。从另一方面讲,如果Monitor.Enter方法调用时另一个线程拥有这个同步块,那么调用线程将被挂起,直至当前拥有这个同步块的线程释放了这个同步块。

 

一旦线程获得了同步块的拥有权,那么代码就可以访问同步块所保护的任何数据。当线程访问完数据后,线程应通过调用Monitor.Exit方法来释放同步块:

static void Exit(Object obj);

如果线程在调用Monitor.Exit方法时还没有拥有指定的对象的同步块,会有一个SynchronizationLockException异常抛出。同样需要引起注意的是线程可以递归拥有同步块:对于每个Monitor.Enter或者Monitor.TryEnter方法的成功调用,在认为不需要拥有同步块时,必须相应地调用一个匹配的Monitor.Exit方法。

原创粉丝点击