多线程线性 lock
有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行。
还有就是一个被lock的方法递归调用会不会死锁,因为需要lock同一个变量。答案当然是不会死锁。
下面是一个测试demo
class Program { private static object a = new object(); private static object b = new object(); private static object c = new object(); private static Hashtable list = Hashtable.Synchronized(new Hashtable()); static void Main(string[] args) { //所有i不相等的线程将同步执行并返回结果 new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(0, 2000); Console.WriteLine("1"); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(1, 2000); Console.WriteLine("1+"); })).Start(); //所有i==2的线程将顺序执行 new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(2, 2000); Console.WriteLine("2"); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(2, 2000); Console.WriteLine("3"); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(2, 2000); Console.WriteLine("4"); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(2, 2000); Console.WriteLine("5"); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Test(2, 2000); Console.WriteLine("6"); })).Start(); //两次lock同一变量不会死锁 new Thread(new ParameterizedThreadStart(delegate(object obj) { Test2(3, 2000); Console.WriteLine("7"); })).Start(); Console.ReadKey(); } /// <summary> /// 对于i相同的线程进行阻塞保证不会并行多个 /// </summary> /// <param name="i"></param> /// <param name="j"></param> public static void Test(int i,int j) { if (!list.ContainsKey(i)) list.Add(i, DateTime.Now); lock (list[i]) { Thread.Sleep(j); } } //多次lock同一变量测试是否会死锁 public static void Test2(int i, int j, bool isFirstRun = true) { if (!list.ContainsKey(i)) list.Add(i, DateTime.Now); lock (list[i]) { Thread.Sleep(j); if (isFirstRun) Test2(i, j, false); } } }
程序输出如下:
1+ 2 1 3 7 4 5 6
桂棹兮兰桨,击空明兮溯流光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!