gpt4 book ai didi

c# - 锁定公共(public)对象,并跨模块共享

转载 作者:行者123 更新时间:2023-11-30 20:05:51 26 4
gpt4 key购买 nike

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

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

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)

是否存在跨模块共享锁是解决问题的好方法的情况?是否有关于锁定公共(public)对象的指南?

最佳答案

如果代码有异味,那就是臭味。

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

防止死锁的唯一方法是将获取锁的情况限制在绝对必要的情况下,并限制在持有锁时将执行的操作,例如避免做任何可能需要另一个锁的事情,但也要避免做任何可能阻塞、休眠或花费很长时间的事情,因为现在已经有效地促进了任何需要这么长时间的操作——它可以一次阻塞多个线程!

将锁公开是一种鼓励开发人员获取他们确实不需要获取的锁,或者他们确实没有考虑获取后果的方法。

您可能想要比我更官方的引用资料!尝试“锁定”声明文档。

In general, avoid locking on a public type, or instances beyond your code's control. The common constructs lock (this), lock (typeof(MyType)), and lock ("myLock") violate this guideline:

lock (this) is a problem if the instance can be accessed publicly.

lock (typeof (MyType)) is a problem if MyType is publicly accessible.

lock(“myLock”) is a problem since any other code in the process using the same string, will share the same lock.

Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.

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

关于c# - 锁定公共(public)对象,并跨模块共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com