컨설턴트가 작성한 일부 코드를 검토 중이며 이미 수십 개의 위험 신호가 나타 났지만 다음 스 니펫에 머리를 감쌀 수는 없습니다.
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 #이 잠금 제거를 수행하는지 또는 잠금의 순서 의미를 보존하는지 여부는 확실하지 않습니다.