标签:
微软官网: https://msdn.microsoft.com/zh-cn/library/ms173179.aspx
官网上提到下面几种:
private System.Object lockThis = new System.Object(); lock (lockThis) { //需要保护的地方 }
VB版是SyncLock
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj);try{ DoSomething(); }finally{ System.Threading.Monitor.Exit(obj); }
使用 lock 通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock确保了即使受保护的代码引发异常,也可以释放基础监视器。
Event
与Windows类似,有 AutoResetEvent和ManualResetEvent,如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。WaitOne,WaitAny和WaitAll则类似WaitForSingleObject/WaitForMultiObject。从字面意义可以看出One表示1个,Any表示1个或多个,All表示所有。
WaitOne causes the thread to wait until a single event becomes signaled, WaitHandle.WaitAny blocks a thread until one or more indicated events become signaled, and WaitHandle.WaitAll blocks the thread until all of the indicated events become signaled. An event becomes signaled when its Set method is called.
尽管 mutex 可以用于进程内的线程同步,但是使用 Monitor 通常更为可取,因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源。 相比之下,Mutex 类是 Win32 构造的包装。 尽管 mutex 比监视器更为强大,但是相对于 Monitor 类,它所需要的互操作转换更消耗计算资源(Mutex可以跨进程,Monitor不行)。
类似MFC的原子操作(InterlockedIncrement...),使用这个类的方法可以安全地递增、递减、交换和比较任何线程中的值。
读写锁,通过调用:AcquireReaderLock,ReleaseReaderLock,AcquireWriterLock,ReleaseWriterLock来完成读锁和写锁控制的
如信号量,可以用来实现生产者/消费者模式
当我们确定某个类的实例在同一时刻只能被一个线程访问时,我们可以直接将类标识成Synchronization的,这样,CLR会自动对这个类实施同步机制,实际上,这里面涉及到同步域的概念,当类按如下设计时,我们可以确保类的实例无法被多个线程同时访问
1) 在类的声明中,添加System.Runtime.Remoting.Contexts.SynchronizationAttribute属性。
2).继承至System.ContextBoundObject,必须
如果临界区是跨越整个方法的,也就是说,整个方法内部的代码都需要上锁的话,使用MethodImplAttribute属性会更简单一些。这样就不用在方法内部加锁了,只需要在方法上面加上 [MethodImpl(MethodImplOptions.Synchronized)] 就可以了。
标签:
原文地址:http://my.oschina.net/shanlilaideyu/blog/485363