最近在阅读《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(); } } } }