当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了。本篇体验线程锁的各种用法以及线程死锁。主要包括:
※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁
□ 使用lock处理数据同步
假设有一个类,主要用来计算该类2个字段的商,在计算商的方法之内让被除数自减,即被除数有可能为零。使用lock语句块保证每次只有一个线程进入该方法。
class ThreadSafe{static readonly object o = new object();PRivate static int _val1, _val2;public ThreadSafe(int val1, int val2){_val1 = val1;_val2 = val2;}public void Calculate(){lock (o){--_val2;if (_val2 != 0){Console.WriteLine(_val1/_val2);}else{Console.WriteLine("_val2为零");}}}}
○ new object()创建的对象实例,也被称作同步对象○ 同步对象必须是引用类型○ 同步对象通常是私有的、静态的
客户端有一个静态字段val2被ThreadSafe的2个实例方法共用。
class Program{private static int val2 = 2;static void Main(string[] args){ThreadSafe ts1 = new ThreadSafe(2, val2);ThreadSafe ts2 = new ThreadSafe(2, val2);Thread[] threads = new Thread[2];threads[0] = new Thread(ts1.Calculate);
新闻热点
疑难解答