这三种类型的锁显然很糟糕。 还有什么其他类型的锁定不好? 有没有Stylecop / FxCop规则可以解决这个问题? 如果没有,那么请你帮我一个自定义规则实现?他们所有人的代码都必须相似,对吗?
谢谢。
答案 0 :(得分:3)
John Robbins的samples书中的Debugging Microsoft .NET Applications(您可能需要允许浏览器中的弹出窗口)包含此类FxCop规则的来源(DoNotLockOnPublicFields,DoNotLockOnThisOrMe,DoNotLockOnTypes等)。看起来它们最初是为FxCop 1.35制作的,而VS 2008中的版本和最新的独立版本是1.36(不是说VS2010)。所以他们可能需要一些调整,YMMV。
还有规则CA2002(不要锁定身份较弱的对象),它会检查lock(typeof(...))
之类的内容,但不会检查lock(this)
答案 1 :(得分:1)
基本上,您不应该锁定任何外部对象,除非这是一个特定的锁定对象(例如非通用SyncRoot
上的ICollection
属性的设计)。这样做会带来参考的其他“用户”也会锁定它的风险,从而导致不必要的锁定甚至死锁。
很明显,this
和typeof()
根据定义是外部对象。字符串是不可变的,字符串文字都是实例,因此即使您在对象中直接指定了相同的引用,也可以在不同的位置使用它们。
我不知道那些StyleCop规则,但我对StyleCop或FxCop的可用内容没有很好的概述,所以很可能会有一些东西来检查这些情况。我只检查私有成员的同步,这些私有成员不是字符串,不能直接在任何属性或方法中返回。