이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 18907|회답: 0

[출처] lock 왜 참조만 잠글 수 있고 값 타입은 잠그지 못하는 이유

[링크 복사]
게시됨 2016. 12. 8. 오전 10:43:37 | | |

값 타입을 전달하면 박스가 되고, 다음에 코드가 실행될 때 다시 박스화되며, 같은 객체가 두 번 아니기 때문에 잠금될 수 없습니다



lock(x)
{
  ...
}

이 잠금은 실제로 Monitor 객체를 통해 수행됩니다:

위의 내용은 다음과 같습니다:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
시도해
{
  ...   
}
마침내
{
  System.Threading.Monitor.Exit(obj);
}

그리고 MSDN의 원래 문구를 인용하자면:
Monitor를 사용해 객체(즉, 참조 타입)를 잠그고, 값 타입을 잠그지 마세요. avalue 타입 변수를 Enter에 전달하면 객체로 박스로 표시됩니다. 같은 변수를 다시 Enter에 전달하면 별도의 객체로 박스에 묶이고, thethread는 차단되지 않습니다. 이 경우, 모니터가 보호해야 할 코드는 보호받지 못합니다. 더 나아가, 변수를 Exit에 넘기면 또 다른 별도의 객체가 생성됩니다. Exit에 전달되는 객체와 Enter에 전달되는 객체가 다르기 때문에, Monitor는 SynchronizationLockException을 던집니다. 자세한 내용은 개념 주제인 모니터를 참조하세요.




이전의:Centos 6.4 시스템에서 Python 2.6.6을 2.7.5로 업그레이드하기
다음:Directory.GetCurrentDirectory와 Application.StartupPath의 차이점
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com