반응형
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 #이 잠금 제거를 수행하는지 또는 잠금의 순서 의미 체계를 보존하는지 여부는 확실하지 않습니다.
반응형
'IT story' 카테고리의 다른 글
UNIQUE 제약 조건이 필드에 INDEX를 자동으로 생성합니까? (0) | 2020.09.14 |
---|---|
Node.js에서 만든 웹 사이트를 Github 페이지에 게시하는 방법은 무엇입니까? (0) | 2020.09.14 |
ASCII 코드는 7 비트입니까, 8 비트입니까? (0) | 2020.09.14 |
Android Room에서 엔티티의 특정 필드 업데이트 (0) | 2020.09.14 |
Haskell의 예외는 어떻게 작동합니까? (0) | 2020.09.14 |