当前位置: 首页 > 编程语言 > C#

多个方法使用同一个锁分享

时间:2023-04-10 17:16:26 C#

多个方法使用同一个锁目前为止我没有遇到过多个方法使用同一个锁的问题,但是想知道是否可以通过下面的代码实现那里实际上是一个问题(性能?),我不知道:privatestaticreadonlyobjectlockObj=newobject();publicintGetValue1(intindex){lock(lockObj){//集合1读和/或写}}publicintGetValue2(intindex){lock(lockObj){//集合2读和/或写}}publicintGetValue3(intindex){lock(lockObj){//Collection3readand/orwrite}}反正3这个方法跟集合没有关系。还有,如果这个lockObj也被lockObj实例使用(在Instance属性中)会不会有什么问题?编辑:为了澄清我在Singleton类中使用相同锁对象的问题:privatestaticreadonlyobjectSyncObject=newobject();publicstaticMySingletonInstance{get{lock(SyncObject){if(_instance==null){_instance=newMySingleton();}}返回实例;}}publicintMyMethod(){lock(SyncObject){//读或写}}这样会不会出问题?如果方法与您声明的方法无关,请为每种方法使用不同的锁;否则效率低下(因为没有理由让不同的方法锁定同一个对象,因为它们可以安全地并发执行)。此外,这些似乎是锁定在静态对象上的实例方法——这是故意的吗?我觉得这是一个错误;实例方法应该(通常)只锁定实例字段。关于Singleton设计模式:虽然锁定对那些人来说是安全的,但最好像这样对字段进行延迟初始化:privatestaticobjectsharedInstance;publicstaticobjectSharedInstance{get{if(sharedInstance==null)Interlocked.CompareExchange(refsharedInstance,newobject(),null);返回共享实例;这稍微快一点(因为互锁方法更快,并且因为初始化被延迟),但仍然是线程安全的。通过使用同一个对象锁定所有这些方法,您可以序列化所有线程中对代码的所有访问。也就是说...运行GetValue1()代码将阻止不同线程中的其他代码运行GetValue2()直到它完成。如果您添加更多锁定同一对象实例的代码,在某些时候您最终会得到一个有效的单线程应用程序。共享锁可以锁住其他不相关的调用。如果使用同一个锁,锁定一个方法也可能不必要地锁定其他方法。如果他们根本不相关,那就是个问题,因为他们必须等待对方。他们不应该这样做。瓶颈当这些方法被频繁调用时,这会造成瓶颈。使用单独的锁,它们将独立运行,但共享同一个锁意味着它们必须根据需要更频繁地(实际上是三倍)等待锁被释放。要创建线程安全的单例,请使用此技术。你不需要锁。总的来说,每把锁应该尽量少用。锁定同一事物的更多方法,您可能会在不需要它时等待它。以上就是C#学习教程:多个方法使用同一个锁,共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: