인터뷰 질문:
낙관적 잠금과 비관적 잠금의 차이점
(학습 영상 공유: java 교육 영상)
1 낙관적 잠금
저는 항상 동시성 문제가 없을 것이라고 생각합니다. 데이터를 처리할 때마다 다른 스레드가 데이터를 수정하지 않을 것이라고 항상 믿어서 잠기지 않습니다. 그러나 업데이트할 때는 이전에 다른 스레드가 데이터를 수정했는지 여부를 판단합니다. . 일반적으로 이를 달성하기 위해 버전 번호 메커니즘 또는 CAS 작업이 사용됩니다
버전 방법:
일반적으로 데이터가 수정된 횟수를 나타내기 위해 데이터 버전 번호 버전 필드가 데이터 테이블에 추가됩니다. 데이터가 수정되면 버전 값이 1씩 증가합니다. 스레드 A가 데이터 값을 업데이트하려고 하면 데이터를 읽는 동안 버전 값도 읽습니다. 업데이트를 제출할 때 방금 읽은 버전 값이 현재 데이터베이스의 버전 값과 동일한 경우에만 업데이트하고, 그렇지 않으면 다시 시도하세요. . 업데이트가 성공할 때까지 업데이트 작업을 수행합니다.
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
(추천 관련 면접 질문 : java 면접 질문 및 답변)
CAS 연산 방법 :
즉, 세 개의 피연산자를 포함하는 비교 및 교환 또는 비교 및 설정, 데이터가 위치한 메모리 값, 기대값, 새로운 값. 업데이트가 필요한 경우 현재 메모리 값이 이전에 얻은 값과 같은지 판단하여 동일하면 새 값으로 업데이트하고 일반적으로 다시 시도합니다. 즉, 지속적인 재시도입니다.
2. 비관적 잠금
항상 최악의 시나리오를 가정합니다. 데이터를 가져올 때마다 다른 스레드가 데이터를 수정할 것이라고 생각하므로 잠금(읽기 잠금, 쓰기 잠금, 행 잠금 등)을 추가합니다. 다른 스레드가 액세스하려고 하면 데이터를 차단하고 일시 중단해야 합니다. 행 잠금, 읽기 잠금, 쓰기 잠금 등과 같이 작업 전에 모두 잠기는 데이터베이스에 의존하여 구현할 수 있습니다. Java에서는 동기화라는 개념도 비관적 잠금입니다.
3. 적용 가능한 시나리오
비관적 잠금: 읽기 작업이 많은 경우 읽을 때마다 잠금이 수행되므로 잠금 오버헤드가 많이 증가합니다. 그리고 시스템 처리량을 줄입니다.
낙관적 잠금: 읽기 작업이 자주 발생하는 시나리오에 더 적합합니다. 많은 수의 쓰기 작업이 발생하면 데이터 충돌 가능성이 높아집니다. 데이터의 일관성을 보장하기 위해 애플리케이션 계층은 지속적으로 재작업해야 합니다. -데이터를 얻으면 쿼리 작업 수가 늘어나고 시스템 처리량이 줄어듭니다.
요약: 둘 다 고유한 장점과 단점이 있습니다. 낙관적 잠금은 빈번한 읽기에 사용되고 비관적 잠금은 빈번한 쓰기에 사용됩니다.
관련 권장 사항: Java 입문 튜토리얼
위 내용은 Java 인터뷰 - 낙관적 잠금 및 비관적 잠금의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!