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

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)