우리는 여러 스레드가 동시에 리소스 클래스를 읽는 데 문제가 없다는 것을 알고 있으므로 동시성의 경우 공유 리소스를 동시에 읽는 것이 가능해야 합니다. 그러나 스레드가 쓰기를 원할 경우; 공유 리소스에 동시에 공유 리소스를 읽거나 쓰는 다른 스레드가 없어야 합니다.
(권장 튜토리얼: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!