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

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

王林
王林앞으로
2020-08-06 17:04:284284검색

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

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

(권장 튜토리얼: 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.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제