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

为了对同步块加锁或解锁,我们需要调用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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值