锁(新对象()) – 货物邪教或一些疯狂的“语言特例”?
我正在审查顾问编写的一些代码,在几十个红旗已经popup的时候,我不能把头围绕在下面的代码片段中:
private void foo() { if (InvokeRequired) { lock (new object()) { if (m_bar!= null) Invoke(new fooDelegate(foo), new object[] { }); } } else { if(OnBazChanged != null) OnBazChanged(); } }
什么是锁(新对象())在这里做? 应该没有任何效果,因为它总是locking在另一个对象上,但是这种locking在整个代码中都是永久的,即使在非复制粘贴的部分。 这是C#语言中的一些特殊情况,是编译成我不知道的东西,还是程序员只是采用了一些前一段时间碰巧工作的货物邪教?
如果有人看到这个,我不会感到惊讶:
private readonly object lockObj = new object(); private void MyMethod() { lock(lockObj) { // do amazing stuff, so amazing it can only run once at a time // eg comands on the Mars Rover, or programs on iOS pre 4 / 5 ?? } }
并认为他可以减less行数。
如果是这样的话,我会很担心的…
这里是类似的问题,并回答:
锁确保相互排斥 – 同时只有一个线程可以锁住锁。 该锁被识别为一个特定的对象实例。 您正在创build一个新的对象来locking每次,并且您没有任何方式通知任何其他线程locking完全相同的对象实例。 因此,你的locking是无用的。
这可能是无用的。 但是有一个机会在那里创造一个记忆障碍。 不知道是否c#lockingelision或者它是否保留锁的sorting语义。