[c#] lock (new object ()) —화물 컬트 또는 미친 “언어 특수 사례”?

컨설턴트가 작성한 일부 코드를 검토 중이며 이미 수십 개의 위험 신호가 나타 났지만 다음 스 니펫에 머리를 감쌀 수는 없습니다.

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}

여기서 lock (new object ())은 무엇입니까? 항상 다른 객체를 잠그기 때문에 아무 효과가 없어야하지만 이러한 유형의 잠금은 복사 및 붙여 넣기가 아닌 부분에서도 코드 전체에서 지속됩니다. 이것은 내가 모르는 것으로 컴파일 된 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
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}

줄 수를 줄일 수 있다고 생각했습니다.

그게 사실이라면 나는 매우 걱정할 것입니다 …


답변

다음 은 비슷한 질문과 답변입니다.

잠금은 상호 배제를 보장합니다. 하나 이상의 스레드가 동시에 잠금을 유지할 수 없습니다. 잠금은 특정 개체 인스턴스로 식별됩니다. 매번 잠글 새 객체를 만들고 다른 스레드에게 정확히 동일한 객체 인스턴스를 잠그도록 알릴 방법이 없습니다. 따라서 잠금은 쓸모가 없습니다.


답변

아마도 쓸모가 없을 것입니다. 그러나 기억 장벽을 만들 수있는 기회가 없습니다. C #이 잠금 제거를 수행하는지 또는 잠금의 순서 의미를 보존하는지 여부는 확실하지 않습니다.


답변