使用 lock 关键字通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock 确 保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过 finally 关键字来实现的,无论是否引发异常它都执行关联的代码块。
同步事件有两种:AutoResetEvent 和 ManualResetEvent。它们之间唯一的不同在于,无论何时,只要 AutoResetEvent 激活线程,它的状态将自动从终止变为非终止。相反,ManualResetEvent 允许它的终止状态激活任意多个线程,只有当它的 Reset 方法被调用时才还原到非终止状态。
4. Mutex对象(互斥量)
与监视器不同的是,命名mutex 可以用来使跨进程的线程同步,且只能有拥有Mutex的线程释放
5. InterLocked类
为多个线程共享的变量提供原子操作。
6. ReaderWriterLock类
定义支持单个写线程和多个读线程的锁。
7. Semaphore信号量
使用一个计数器对共享资源进行访问控制,Semaphore构造函数需要提供初始化的计数器(信号量)大小以及最大的计数器大小。
访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。
初始化信号量大小 与当前线程调用了 WaitOne(maximumCount 减去 initialCount)次相同。
命名信号量系统级有效