다중 스레딩에서 잠금을 위해 개인 정적 읽기 전용 개체를 사용하는 것은 매우 일반적입니다. 개인은 캡슐화를 조여 잠금 개체에 대한 진입 점을 줄이고 따라서 가장 필수적인 항목에 액세스 할 수 있음을 이해합니다.
하지만 왜 정적일까요?
private static readonly object Locker = new object();
마지막에 필드는 내 클래스 내에서만 사용되며 대신 이것을 사용할 수도 있습니다.
private readonly object Locker = new object();
다른하실 말씀 있나요?
최신 정보:
예를 들어이 코드를 붙여 넣었습니다 (예제). 나는 이것에 정적 또는 비 정적 사물함을 사용할 수 있으며 둘 다 잘 작동합니다. 아래의 답변을 고려할 때 내 사물함을 이와 같이 정의해야합니까? (미안하지만 다음 주에 인터뷰가 있고 모든 세부 사항을 알아야합니다. 🙂
private readonly object Locker = new object();
다음은 코드입니다.
private int _priceA;
private int _priceB;
private EventWaitHandle[] _waithandle;
private readonly IService _service;
//ctor
public ModuleAViewModel(IService service)
{
_service = service;
_modelA = new ModelA();
_waithandle = new ManualResetEvent[2];
_waithandle[0] = new ManualResetEvent(false);
_waithandle[1] = new ManualResetEvent(false);
LoadDataByThread();
}
private void LoadDataByThread()
{
new Thread(() =>
{
new Thread(() =>
{
lock (Locker)
{
_priceA = _service.GetPriceA();
}
_waithandle[0].Set();
}).Start();
new Thread(() =>
{
lock (Locker)
{
_priceB = _service.GetPriceB();
}
_waithandle[1].Set();
}).Start();
WaitHandle.WaitAll(_waithandle);
PriceA = _priceA;
PriceB = _priceB;
}).Start();
}
감사
답변
“다중 스레딩에서 잠금을 위해 개인 정적 읽기 전용 개체를 사용하는 것이 매우 일반적”이 아니라 적절한 / 선택된 세분성에서 잠금을 사용하는 것이 일반적 입니다. 때때로 그것은 static
. 더 자주, IMO는 그렇지 않지만 인스턴스 기반입니다.
static
잠금이 표시되는 주요 시간 은 글로벌 캐시 또는 글로벌 데이터 / 싱글 톤의 지연된로드입니다. 그리고 후자의 경우 어쨌든 더 나은 방법이 있습니다.
그래서 그것은 정말로 다릅니다 : Locker
당신의 시나리오에서 어떻게 사용됩니까? 자체적으로 정적 인 것을 보호하고 있습니까? 그렇다면 잠금은 정적이어야합니다. 인스턴스 기반을 보호하는 경우 IMO 잠금 도 인스턴스 기반이어야합니다.
답변
정적 일 필요는 없습니다 . 사실 때로는 정적 일 필요가 없습니다 .
변수는 잠금에 사용하는 메서드와 동일한 범위에 있어야합니다. 메서드가 정적이면 변수는 정적이어야하고 메서드가 인스턴스 메서드이면 변수는 인스턴스 변수 여야합니다.
인스턴스 메서드에서 잠그는 데 사용되는 정적 변수는 계속 작동하지만 너무 많이 잠 깁니다. 동일한 인스턴스의 메서드뿐만 아니라 모든 인스턴스의 모든 메서드를 잠급니다.
답변
잠금의 범위와 수명은 잠 그려는 ‘물건’에 따라 달라집니다. 정적 잠금은 주로 정적 사물을 잠그는 데 사용됩니다.