锁定公共对象,并跨模块共享

Aus*_*ris 2 c# concurrency multithreading blocking

我正在审查一些代码,并看到了我以前从未见过的东西.我找到了一个用于锁定的对象的所有引用,并得到了以下结果.

我已经替换了所有文件/类/成员名称以保护那些可能需要保护的人.

C:\Sln1\ProjX\ClassX.cs - (17, 26) : public static object PublicStaticLockObj = new object();
C:\Sln1\Proj1\Class1.cs - (193, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj1\Class1.cs - (228, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj1\Class1.cs - (92, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (115, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (181, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj2\Class2.cs - (216, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (160, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (195, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj3\Class3.cs - (95, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj4\Class4.cs - (133, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj4\Class4.cs - (252, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj4\Class4.cs - (286, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj5\Class5.cs - (252, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj5\Class5.cs - (320, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj5\Class5.cs - (360, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj6\Class6.cs - (112, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj6\Class6.cs - (177, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj6\Class6.cs - (212, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj7\Class7.cs - (165, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj8\Class8.cs - (129, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj8\Class8.cs - (198, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj8\Class8.cs - (233, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj9\Class9.cs - (156, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj9\Class9.cs - (191, 20) : lock (ClassX.PublicStaticLockObj)
C:\Sln1\Proj9\Class9.cs - (90, 20) : lock (ClassX.PublicStaticLockObj)
Run Code Online (Sandbox Code Playgroud)

是否存在跨模块共享锁定是解决问题的好方法?是否有关于锁定公共对象的指导?

Tim*_*ith 5

如果代码闻起来,那就是臭气熏天.

作为同步机制的锁的主要缺点是它们不可编写 - 需要非常容易地获取多个锁导致死锁.

防止死锁的唯一方法是将锁定的情况限制在绝对必要的位置,并限制在锁定时执行的操作,例如避免做任何可能需要锁定的操作,但也避免做任何可以阻塞,睡眠或花费很长时间的事情,因为现在有效地提升了所需的操作 - 它可以立即阻止多个线程!

公开锁是一种鼓励开发人员采取他们真正不需要采取的锁,或者他们真的没有考虑采取后果的方法.

你可能想要一个比我更官方的参考!试试'lock'语句文档.

通常,避免锁定公共类型或超出代码控制范围的实例.常见的构造锁(this),lock(typeof(MyType))和lock("myLock")违反了这个指南:

如果可以公开访问实例,则锁定(this)是一个问题.

如果MyType可公开访问,则lock(typeof(MyType))是一个问题.

lock("myLock")是一个问题,因为进程中的任何其他代码使用相同的字符串,将共享相同的锁.

最佳做法是定义要锁定的私有对象,或私有静态对象变量以保护所有实例共有的数据.

来源:http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.80).aspx