>source

강좌가 있습니다 :

public class Checker
{
    private HashSet<int> _hs = new HashSet<int>();
    public bool Check(int a)
    {
        return Volatile.Read(ref _hs).Contains(a);
    }
    public void Update(IEnumerable<int> items)
    {
        Volatile.Write(ref _hs, new HashSet<int>(items));
    }
}

방법 Check  여러 스레드에서 자주 호출됩니다. 방법 Update  일부 소스 (데이터베이스, http 서비스 등)를 모니터링하는 단일 스레드에서 호출됩니다. 이 패턴은 Volatile.Read / Volatile.Write 입니까  사용법이 맞습니까?

  • 답변 # 1

    당신이 의미한다면  항상 최신 버전의 필드를 사용하십시오. "그렇습니다. 변동성의 부작용으로 이러한 경우가 발생합니다. 전체 참조를 바꾸는 것이 지속적으로 동기화하는 것보다 훨씬 저렴합니다 (.NET을 사용하면 참조 스왑은 참조 스왑이 원 자성으로 보장됩니다.

    참고 :이 시나리오의 스레드 안전성은 해시 세트가 생성되고 참조가 교체 된 후에 해시 세트가 변경되지 않았다는 사실에 따라엄격히코드에 발생합니다. 질문에.

    그러나 필드를 Check 로 선언하면 동일한 결과를보다 편리하게 얻을 수 있습니다. :

    volatile
    
    

    public class Checker { private volatile HashSet<int> _hs = new HashSet<int>(); public bool Check(int a) => _hs.Contains(a); public void Update(IEnumerable<int> items) => _hs = new HashSet<int>(items); }

  • 이전 sql server - 기류에서 저장 프로 시저 실행
  • 다음 css - 같은 줄에 양식 입력 정렬