你给. net里的锁机制

你给.NET里的锁机制打个比方,它其实就像一个门上的锁头。lock关键字是个大门,把它锁上了就意味着同一时间只允许一个人进去。这时候其他想进来的人就得在门外排队等着,等里面的人把门打开,也就是释放了锁,外面的人才有机会进。这个原理说白了就是:线程先看一下这把锁有没有人在用,如果没人用就直接进去干活;要是有人在用,就只能乖乖去旁边等消息。等干活的线程把事办完了,它就把门一拉打开锁,通知外面排队的人可以进来了。 这么一来,大家就不会在没商量好的情况下同时修改同一份数据了,数据也就不容易乱套。不过这把锁也有它不好的地方。比如可能会让人觉得速度变慢了(因为有些线程在阻塞等锁),还有就是用不好可能会卡住程序走不动。这种卡住不动的情况就是死锁。比如说有两个人 A 和 B,A 拿着钥匙 1 想要钥匙 2,B 拿着钥匙 2 想要钥匙 1,这就好比两个人在门口互相等对方先开门,结果谁也进不去。 在.NET里要想避免死锁,有几个招儿可以用。比如说让大家按同一个顺序去拿钥匙;或者把每个区域的门锁范围缩小一点;再或者尽量别在一个区域的锁里面再去拿另一个区域的锁;还可以给等待设置一个时间限制,别让大家一直傻等。 除了这个标准的锁机制之外,.NET还有好多其他的同步方式供咱们选择。Monitor其实就是lock的底层实现方式,它能让咱们更灵活地控制,比如可以用TryEnter来试试能不能进。Mutex这种工具适合在不同的进程之间共享资源用。Semaphore还有SemaphoreSlim是用来限制同时能进去多少人的,就好比控制游泳池里能游多少人的那种。ReaderWriterLockSlim是专门为了那种读多写少的情况准备的,能让大家读得更快。Interlocked则是那种专门用来做简单加减操作的小工具,速度非常快。 不同的机制在性能和用起来难不难上差别挺大。比如说要读的数据特别多、写得很少的时候,用ReaderWriterLockSlim就很合适;要是只是需要简单地加个计数器统计个数,那Interlocked就非常好使。