c# 오라클 연동 예제

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

교착 상태 또는 잠금 경합이 발생할 수 있으므로 다른 공유 리소스에 대해 동일한 잠금 개체 인스턴스를 사용하지 마십시오. 특히 다음을 잠금 개체로 사용하지 마십시오: 예를 들어 [2] (다른 모든 Java 코드 세그먼트뿐만 아니라)에서 제공하는 Java 프로그래밍 언어의 이 코드 세그먼트를 고려하십시오: 5/25/2009 업데이트: 인터록이 항상 가장 빠르다는 것이 분명합니다. 단일 스레드 테스트. 또 다른 생각을 감안할 때, 그것은 때때로 수행하지만 액세스 충돌이 거의 발생하지 않는 경우에 Interlocked를 사용해야한다는 것을 나타냅니다. 예를 들어, 가끔 쓰기가 주 스레드의 과도한 쓰기 액세스 속도를 늦추지 않도록 합니다!? 테스트 결과가 다음과 같은 이유를 쉽게 추론할 수 있습니다. 각각의 CPU 아키텍처를 살펴보십시오. 코어2듀오스는 L2를 공유했습니다. 연동 된 작전은 FSB를 잠그고 버스를 스누핑하고 가장 최근에 업데이트 된 값으로 CPU에서 회신을 기다릴 필요가 없습니다. Core2Duos가 L2로 나가는 데 지불하는 유일한 페널티는 자체 L1에 비해 더 긴 대기 시간입니다. 하지만 서버 박스는 효율성이 낮습니다. 테스트의 경우 가장 업데이트된 값이 있는 CPU는 값을 업데이트하려는 CPU의 스눕 요청에 대한 응답으로 값을 게시해야 합니다.

무슨 생각, 바로 거기 병목 현상. FSB는 항상 온 실리콘 L2 캐시보다 훨씬 느려질 것입니다. 우리가 앞으로 나아갈 때, FSB는 과거의 일이 될 것입니다. 이것은 병목 현상을 다소 완화할 것이지만 진정한 멀티 코어 CPU만큼 빠르지는 않습니다. 모든 CPU에서 읽고 쓰는 것이 장벽을 가로질러 이동할 수 없도록 하는 프로세스 차원의 메모리 장벽을 제공합니다. 문제는 여러 스레드를 사용할 때 이 문제가 작동하지 않는다는 것입니다. 두 스레드가 getHelper()를 동시에 호출하는 경우 잠금을 가져와야 합니다. 그렇지 않으면 둘 다 동시에 개체를 만들려고 하거나 불완전하게 초기화된 개체에 대한 참조를 얻는 것이 바람질 수 있습니다.

Comments

comments