W.r.t ReadWriteLock, 내가 뭔가를 읽으 려하는 동안 왜 잠금이 필요합니까? 내 지식에 대한 잠금은 변수를 돌연변이하는 경우에만 사용하고, 동시 스레드가 변수를 돌연변이시키지 않도록 읽는 것이 아닙니다. 그렇다면 우리는 왜 독서에만 잠금 장치가 필요합니까?왜 독서 용으로 자바 잠금이 필요한가요?
0
A
답변
4
ReaderWriterLock의 요점은 읽는 동안 다른 스레드가 무언가를 변경시키지 않는지 확인하는 것입니다.
쓰기 부분 (판독기는 작성자를 기다리고, 그 반대의 경우도 제외)을 제외하고는 잠금의 읽기 부분이 독점적이지 않습니다 (여러 개의 동시 판독자가있을 수 있음).
0
어떤 종류의 객체는 서로에게 어떤 관계가있을 것으로 예상되는 가변 상태의 여러 측면을 캡슐화합니다. 예를 들어, List
은 Count
속성과 일련의 번호 매기기 슬롯을 가질 수 있습니다. 목록에 100 개의 항목이 포함되어 있고 스레드가 목록을 열려고한다고 가정합니다. 열거 스레드가 항목 50에 도달 할 즈음에 다른 스레드가 항목 25를 삽입하기 전에 항목을 삽입하려고 시도합니다.
열거 형 스레드가 시작하기 전에 읽기 잠금 토큰을 획득하고 완료 될 때 열거 스레드가 항목을 삽입하려는 스레드가 먼저 쓰기 잠금 토큰을 획득하면 열거 형 스레드가 읽기 잠금 토큰은 열거가 완료 될 때까지 업데이트 스레드가 목록을 수정하지 못하도록합니다. 아무런 충돌없이 여러 개의 열거 형 스레드가 동시에 작동 할 수 있지만 목록을 변경하기 전에 모든 스레드가 완료 (읽기 잠금 토큰 해제)해야합니다. 일단 쓰기 잠금 토큰 요청이 이루어지면 쓰기 잠금 토큰이 발급되고 해제 될 때까지 읽기 잠금 토큰에 대한 요청이 지연됩니다. 이 작업이 완료되지 않았 으면 계속해서 읽기 요청을 보내면 쓰기 요청이 실행되지 않을 수 있습니다.
자세한 내용 : 코드가 복잡한 구조가 아닌 정수 만 읽는 경우에도 잠금 또는 원자량이 필요합니다. 다른 CPU가 캐시에서 플러시 할 의무가 없으므로 스레드가 없으면 스레드가 업데이트 된 값을 볼 수 있습니다. 이것은 x86 캐시 규칙에서는 발생하지 않지만 코드 실행 위치를 알 수는 없습니다. –