찾다
JavaJava시작하기읽기-쓰기 잠금이란 무엇입니까?

읽기-쓰기 잠금이란 무엇입니까?

Aug 06, 2020 pm 05:04 PM
읽기-쓰기 잠금

읽기-쓰기 잠금이란 무엇입니까?

우리는 여러 스레드가 동시에 리소스 클래스를 읽는 데 문제가 없다는 것을 알고 있으므로 동시성의 경우 공유 리소스를 동시에 읽는 것이 가능해야 합니다. 그러나 스레드가 쓰기를 원할 경우; 공유 리소스에 동시에 공유 리소스를 읽거나 쓰는 다른 스레드가 없어야 합니다.

(권장 튜토리얼: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 csdn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

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

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

PhpStorm 맥 버전

PhpStorm 맥 버전

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

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구