用来同步对实例和静态成员的访问箦略:
同步代码区域: 可以使用monitor 类和该类的编译器支持来仅同步需要该类的代码块,从而改善性能。
C# 都支持使用特定的语言关键字来标记代码块。最终生成的代码将尝试在代码执行时获取锁。如果锁已经被获取,则正在执行的代码将一直等待,直到锁可用为止。当代码退出同步代码块时,锁被释放。还可以用 MethodImplAttribute 和 MethodImplOptions.Synchronized 修饰方法,其效果与使用 Monitor 或一个用于 Monitor 代码块的编译器关键字完全相同。
class MonitorExample {
//Define the queue to safe thread access.
private Queue m_inputQueue;
public MonitorSample()
{
m_inputQueue = new Queue();
}
//Add an element to the queue and obtain the monitor lock for the queue object.
public void AddElement(object qValue)
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
//Add element
m_inputQueue.Enqueue(qValue);
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
//Try to add an element to the queue.
//Add the element to the queue only if the queue object is unlocked.
public bool AddElementWithoutWait(object qValue)
{
//Determine whether the queue is locked
if(!Monitor.TryEnter(m_inputQueue))
return false;
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
return true;
}
//Try to add an element to the queue.
//Add the element to the queue only if during the specified time the queue object will be unlocked.
public bool WaitToAddElement(object qValue, int waitTime)
{
//Wait while the queue is locked.
if(!Monitor.TryEnter(m_inputQueue,waitTime))
return false;
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
return true;
}
//Delete all elements that equal the given object and obtain the monitor lock for the queue object.
public void DeleteElement(object qValue)
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
int counter = m_inputQueue.Count;
while(counter > 0)
{
//Check each element.
object elm = m_inputQueue.Dequeue();
if(!elm.Equals(qValue))
{
m_inputQueue.Enqueue(elm);
}
--counter;
}
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
//Print all queue elements.
public void PrintAllElements()
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
IEnumerator elmEnum = m_inputQueue.GetEnumerator();
while(elmEnum.MoveNext())
{
//Print the next element.
Console.WriteLine(elmEnum.Current.ToString());
}
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
static void Main(string[] args)
{
MonitorSample sample = new MonitorSample();
for(int i = 0; i < 30; i++)
sample.AddElement(i);
sample.PrintAllElements();
sample.DeleteElement(0);
sample.DeleteElement(10);
sample.DeleteElement(20);
sample.PrintAllElements();
}
}
}
更多详细信息见:
http://msdn2.microsoft.com/zh-cn/library/z8chs7ft.aspx