锁定公共对象,并在模块之间共享

本文关键字:模块 之间 共享 公共对象 锁定 | 更新日期: 2023-09-27 18:33:24

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

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

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)

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

锁定公共对象,并在模块之间共享

如果代码闻起来,那会散发出气味。

锁作为同步机制的主要弱点是它们不可组合 - 需要获取多个锁很容易导致死锁。

防止死锁的唯一方法是将获取锁的情况限制在

绝对必要的情况下,并且还限制在保持锁时将执行的操作,例如避免做任何可能占用另一个锁的事情,但也避免做任何可以阻塞的事情, 睡眠,或者需要很长时间,因为无论需要这么长时间的操作现在都得到了有效的提升 - 它可以一次阻塞多个线程!

公开锁是一种鼓励开发人员拿走他们真的不需要拿锁的方式,或者他们真的没有考虑过拿锁的后果。

你可能想要一个比我更官方的参考!尝试"锁定"语句文档。

通常,请避免锁定公共类型或代码无法控制的实例。常见的构造 lock (this(、lock (typeof(MyType(( 和 lock ("myLock"( 违反了以下准则:

如果可以公开访问实例,则锁定(此(是一个问题。

锁(typeof (MyType((是一个问题,如果MyType是可公开访问的。

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

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

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

PublicStaticLockObject 可能旨在同步对某些 PublicStaticResource 的访问,在这种情况下,如果每个人都很好地使用该对象,您就不会遇到麻烦。 但是,如果有人将该锁对象用于其他资源,则存在死锁的风险。 另请注意,该对象不是只读的,因此有人可以用新对象替换它。 这也可能会造成麻烦。

这就是为什么 ClassX 应该声明一个私有锁对象,然后通过公共静态方法公开公共静态资源;这些方法将包含 lock 语句来保护资源。 例如,之前:

public static class ClassX
{
    public static FileStream Stream { get; private set; }
    public static object PublicStaticLockObj = new object();
}
public class ClassY
{
    public void WriteToTheGlobalStream(byte b)
    {
        lock (ClassX.PublicStaticLockObj)
            ClassX.Stream.WriteByte(b);
    }
}

后:

public static class ClassX
{
    private static FileStream Stream { get; set; }
    private static object PublicStaticLockObj = new object();
    public static void WriteToTheStream(byte b)
    {
        lock (PublicStaticLockObj)
            Stream.WriteByte(b);
    }
}
public class ClassY
{
    public void WriteToTheGlobalStream(byte b)
    {
        ClassX.WriteToTheStream(b);
    }
}