우리는 여러 스레드가 동시에 리소스 클래스를 읽는 데 문제가 없다는 것을 알고 있으므로 동시성의 경우 공유 리소스를 동시에 읽는 것이 가능해야 합니다. 그러나 스레드가 쓰기를 원할 경우; 공유 리소스에 동시에 공유 리소스를 읽거나 쓰는 다른 스레드가 없어야 합니다.
(권장 튜토리얼: Java 튜토리얼 시작하기)
우리가 원하는 것은 여러 스레드가 동시에 읽을 수 있도록 허용하는 것입니다. 하지만 하나의 스레드가 쓰고 있는 한 다른 스레드는 기다려야 합니다.
읽기-쓰기 잠금은 이 원칙을 기반으로 합니다. 즉, 읽기-쓰기 잠금은 여러 다중 스레드가 동시에 액세스할 수 있도록 허용하지만 쓰기 스레드가 액세스하면 모든 읽기 스레드와 다른 쓰기 스레드가 액세스하게 됩니다. 차단됩니다. 읽기-쓰기 잠금은 실제로 읽기 잠금과 쓰기 잠금의 쌍을 유지하므로 배타적 잠금(배타적 잠금)에 비해 동시성이 크게 향상됩니다.
코드 예:
public class ReadWriteLockDemo { public static void main(String[] args) { ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Book book = new Book();//创建一本书,可读可写 //两个写手 for (int i = 0; i < 2; i++) { int num = i; new Thread(()->{ try { readWriteLock.writeLock().lock(); System.out.println("写手"+num+"在写文章"); book.write(String.valueOf(num),UUID.randomUUID().toString().substring(0,5)); }catch (Exception e){ e.printStackTrace(); }finally { readWriteLock.writeLock().unlock(); } },String.valueOf(i)).start(); } //6个读者 for (int i = 0; i < 6; i++) { int num = i; new Thread(()->{ try { readWriteLock.readLock().lock(); String word = book.read(String.valueOf(num % 2)); System.out.println("读者"+num+"在阅读文章..."+word); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } },String.valueOf(i)).start(); } } } class Book{ HashMap<String, String> map = new HashMap<>(); public void write(String key,String val){ map.put(key, val); } public String read(String key){ String word = map.get(key); return word; } }
출력 결과:
"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=54141:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\idea_workplace\javaBase\target\classes" 写手0在写文章 写手1在写文章 读者0在阅读文章...6b021 读者1在阅读文章...220e4 读者2在阅读文章...6b021 读者4在阅读文章...6b021 读者3在阅读文章...220e4 读者5在阅读文章...220e4 Process finished with exit code 0
읽기-쓰기 잠금의 효율성
(비디오 튜토리얼 권장 사항: java 비디오 튜토리얼)
읽기-쓰기 잠금이 뮤텍스 잠금 사용 성능을 향상시킬지 여부는 다음에 달려 있습니다. 데이터는 읽기 및 수정 빈도, 읽기 및 쓰기 작업 기간, 데이터 경합, 동시에 데이터를 읽거나 쓰려고 시도하는 스레드 수입니다.
예를 들어 처음에는 데이터로 채워진 다음 자주 검색되고(예: 일종의 디렉터리) 수정되는 컬렉션은 읽기-쓰기 잠금을 사용하기에 이상적인 후보입니다. 그러나 업데이트가 자주 발생하면 동시성이 거의 증가하지 않고 대부분의 시간 동안 데이터가 독점적으로 잠깁니다.
또한 읽기 작업이 너무 짧으면 읽기-쓰기 잠금 구현의 오버헤드(뮤텍스보다 더 복잡함)가 실행 비용을 지배할 수 있습니다. 특히 많은 읽기-쓰기 잠금 구현이 여전히 모든 스레드를 직렬화하기 때문입니다. 작은 섹션 코드를 통해. 궁극적으로 프로파일링과 측정만이 읽기-쓰기 잠금 사용이 애플리케이션에 적합한지 여부를 결정합니다.
위 내용은 읽기-쓰기 잠금이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구
