原文地址:http://www.codeproject.com/KB/architecture/TalkativeLockerPattern.aspx
我想要开发一个简单的设计模式,可以使开发人员更容易调试多线程的程序。在这篇文章中,我将介绍TalkativeLocker设计模式。TalkativeLocker模式的目的是将锁定的代码与其他的代码隔离开,只有单一点锁可以进入,获得,释放。下面是简单演示:
public class TalkativeLocker<T> { private readonly static object toLock = new object(); public T EnterLock(IClient client, Func<T> function) { T result = default(T); Console.WriteLine(client.Name + ":Waiting for lock"); Monitor.Enter(toLock); try { Console.WriteLine(client.Name + ":AquiredLock"); result = function(); } catch (Exception ex) { // } finally { Console.WriteLine(client.Name + ":About release lock"); Monitor.Exit(toLock); } return result; } }
TalkativeLocker
包括一个私有的对象toLock用于锁定。该对象是Static的,这就是说他是共享的,一次只有一个线程可以在他上面获得锁。
TalkativeLocker
还有一个Func<T>参数表示当获得锁的时候调用的程序。
下面看看如何使用
TalkativeLocker
类,先定义接口如下:
public interface IClient { string Name { get; set; } }
}
该接口只有一个Name属性,该属性可以让开发人员在调试多线程程序时更方便的显示相关调试信息。下面是该类的简单实现:
public class Client : IClient { private string name = String.Empty; private readonly TalkativeLocker<int> talkativeLocker = new TalkativeLocker<int>(); public Client(string name) { Name = name; } public string Name { get { return name; } set { name = value; } } public int AddTwoNumbers() { return 1 + 2; } public void DoSomething() { int result = talkativeLocker.EnterLock(this, AddTwoNumbers); } }
static void Main(string[] args) { Client[] clients = new Client[10]; clients[0] = new Client("1"); clients[1] = new Client("2"); clients[2] = new Client("3"); clients[3] = new Client("4"); clients[4] = new Client("5"); clients[5] = new Client("6"); clients[6] = new Client("7"); clients[7] = new Client("8"); clients[8] = new Client("9"); clients[9] = new Client("10"); foreach (Client client in clients) { Thread t = new Thread(client.DoSomething); t.Start(); } Thread.CurrentThread.Join(); Console.ReadLine(); }
运行结果如下:
作者:生鱼片
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
设计模式
标签:
TalkativeLocker
, Pattern
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
2008-11-26 如何开发Domino中的WebService