最近在阅读《c#高级编程》 这本书。记录一下关于锁的使用
大致分为三种方法:
方法1:使用 lock
方法2:使用 Interlocked
方法3:使用 Monitor
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int numTasks = 20;
var state = new SharedState();
var tasks = new Task[numTasks];
for (int i = 0; i < numTasks; i++)
{
tasks[i] = Task.Run(() => new Job(state).DoTheJob());
}
for (int i = 0; i < numTasks; i++)
{
tasks[i].Wait();
}
Console.WriteLine("summarized {0}", state.State);
Console.ReadLine();
}
}
public class SharedState
{
private int state = 0;
private object syncRoot = new object();
public int State
{
get { return state; }
}
public int IncrementState()
{
//方法1:使用interlocked
//return Interlocked.Increment(ref state);
//方法2:使用lock
//lock (syncRoot)
//{
// state++;
// return state;
//}
//方法3:使用Monitor
Monitor.Enter(syncRoot);
try
{
state++;
return state;
}
finally
{
Monitor.Exit(syncRoot);
}
//Monitor的其他用法:等待超过超时时间就不等了
//bool lockTaken = false;
//Monitor.TryEnter(syncRoot, 500, ref lockTaken);
//if (lockTaken)
//{
// try
// {
// //do something
// }
// finally
// {
// Monitor.Exit(syncRoot);
// }
//}
//else//未获得锁
//{
// //do something else
//}
}
}
public class Job
{
SharedState sharedState;
public Job(SharedState sharedState)
{
this.sharedState = sharedState;
}
public void DoTheJob()
{
for (int i = 0; i < 5000; i++)
{
sharedState.IncrementState();
}
}
}
}