Application与线程同步

        昨天写了篇文字《static变量与asp.net 》,说到Application与static member的区别的时候,提到了Application对象的线程安全方面的问题。《线程同步问题:static成员与ASP.NET中的Application对象 》提出了进一步的讨论。今天我又想将昨天没有说清楚地这一部分不补上
       Application对象使用了一个字典来保存所有的对象。对每个对象的读写都会加锁。他的锁分为读与写两种。该锁内部维护了一个int字段。加读锁时等待该变量不为-1(没有处于写状态),将该变量加1,解读锁时将改变量减一;加写锁时等待该变量为0(表示没有任何对象锁定),将该变量赋值为-1,解写锁时将改变量赋值为0。很明显对这个变量的操作是要加排他锁的。
       这样的结果就是:一个Application对象处于写状态时,会拒绝其他Application对象的读、写操作;一个Application对象处于读状态时,会拒绝其他Application对象的写操作;即便两个Application对象可以同时读,但他们读操作中,加读锁的动作是排他的。
       Application对象使用过程中,加锁的动作会增加不少的性能损失。而不同的Application对象之间的阻塞,也会增加不少损失。
       而对于static member,一般情况下读不用作加锁操作。写的时候需要加锁,但一般也不会影响到其他的static member。
       

posted on 2004-04-28 20:28  Meyer  阅读(1582)  评论(4编辑  收藏  举报

导航