예를 들어 사전에 다른 항목을 추가할 때 연결된 목록을 반복하여 키가 이미 있는지 확인하고 새 항목을 헤드 노드로 추가합니다. 항목을 제거할 때 제거할 항목(있는 경우)을 찾아 링크된 목록에서 노드를 제거합니다. 항목을 추가, 업데이트 및 제거하면 모두 이 패턴을 따릅니다. SQL Server 2012로 작업하는 경우 마지막 설정 격리 수준은 다른 컨텍스트에서 연결 풀에서 다시 검색된 경우에도 항상 연결을 따릅니다. 예를 들어 커밋되지 않은 연결을 읽도록 트랜잭션 범위를 설정하면 트랜잭션 범위가 다음에 트랜잭션 범위를 변경할 때까지 항상 더러워지는 읽기를 수행합니다.예를 들어 [2]에서 제공한 Java 프로그래밍 언어로이 코드 세그먼트를 고려하십시오(모든 것 뿐만 아니라 모든 다른 Java 코드 세그먼트: 스레드 액세스를 공유 리소스에 동기화할 때 전용 개체 인스턴스(예: 개인 readonly 개체 balanceLock = 새 개체()를 잠급니다;) 또는 코드의 관련없는 부분에서 잠금 개체로 사용될 가능성이 낮은 다른 인스턴스입니다. 교착 상태 또는 잠금 경합이 발생할 수 있으므로 다른 공유 리소스에 대해 동일한 잠금 개체 인스턴스를 사용하지 마십시오. 특히 다음을 잠금 개체로 사용하지 마십시오: 위의 사소한 작업 예제 대신 다시 선택된 관용구를 사용하려는 경우(예: 2015 릴리스 이전의 Visual Studio에서 C++11 표준 언어를 구현하지 않았기 때문입니다. [3] 위에 인용된 동시 초기화는 울타리를 획득하고 해제해야 합니다:[4] 직관적으로 이 알고리즘은 문제에 대한 효율적인 해결책처럼 보입니다. 그러나 이 기술은 많은 미묘한 문제를 가지고 있으며 일반적으로 피해야 합니다. 예를 들어 다음 예제와 같이 값비싼 동기화를 통해 잠금을 가져오는 이벤트의 다음 시퀀스를 고려합니다. 이 예제에서 “잠금 힌트”는 mySingleton 개체이며 완전히 생성되고 사용할 준비가 되면 더 이상 null이 아닙니다. 다음 예제는 전용 balanceLock 인스턴스를 잠그고 개인 잔액 필드에 대한 액세스를 동기화하는 Account 클래스를 정의합니다.

잠금에 동일한 인스턴스를 사용하면 차변 또는 신용 메서드를 동시에 호출하려고 시도하는 두 스레드에서 잔액 필드를 동시에 업데이트할 수 없습니다. 2009년 5월 25일 업데이트: 한 가지 분명한 점은 인터로크로는 항상 단일 스레드 테스트에서 가장 빠릅니다. 또 다른 생각을 감안할 때, 그것은 때때로 수행하지만 액세스 충돌이 거의 발생하지 않는 경우에 Interlocked를 사용해야한다는 것을 나타냅니다. 예를 들어, 가끔 쓰기가 주 스레드의 과도한 쓰기 액세스 속도를 늦추지 않도록 합니다!? 4 개의 CPU 상자에서 병렬 스레드 수가 증가하면 연동 된 레이스가 손실되기 시작합니다. 그러나 getHelper()에 대한 첫 번째 호출은 개체를 만들고 해당 시간 동안 액세스하려는 몇 개의 스레드만 동기화해야 합니다. 그 후 모든 호출은 멤버 변수에 대한 참조를 가져옵니다.

Scroll Up