Readers-Writer 잠금은 이름에서 알 수 있듯이 읽기 잠금과 쓰기 잠금의 두 부분으로 나누어진 잠금입니다. 읽기 잠금을 사용하면 여러 스레드가 동시에 잠금을 획득할 수 있습니다. 작업 자체는 스레드로부터 안전하며, 쓰기 잠금은 여러 스레드가 동시에 쓰기 잠금을 얻는 것을 허용하지 않는 상호 배타적 잠금이며, 쓰기 작업과 읽기 작업도 상호 배타적입니다. 요약하면 읽기-쓰기 잠금의 특징은 다음과 같습니다. 읽기와 읽기는 상호 배타적이지 않고, 읽기와 쓰기는 상호 배타적이며, 쓰기와 쓰기는 상호 배타적입니다.
Java 언어에서 읽기-쓰기 잠금은 ReentrantReadWriteLock 클래스를 사용하여 구현됩니다. 여기서
ReentrantReadWriteLock.ReadLock
은 읽기 잠금을 나타냅니다. 잠금 방법을 사용하여 잠그고 잠금 해제 방법을 사용하여 잠금을 해제합니다. ReentrantReadWriteLock.ReadLock
表示读锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。
ReentrantReadWriteLock.WriteLock
ReentrantReadWriteLock.WriteLock
은 잠금을 위한 잠금 방법과 잠금 해제를 위한 잠금 해제 방법을 제공하는 쓰기 잠금을 나타냅니다.
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 获得读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); // 获得写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); // 读锁使用 readLock.lock(); try { // 业务代码... } finally { readLock.unlock(); } // 写锁使用 writeLock.lock(); try { // 业务代码... } finally { writeLock.unlock(); }1.1 읽기와 읽기는 상호 배타적이지 않습니다.
여러 스레드가 동시에 읽기 잠금을 획득할 수 있습니다.
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); Thread t1 = new Thread(() -> { readLock.lock(); try { System.out.println("[t1]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放读锁."); readLock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { readLock.lock(); try { System.out.println("[t2]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放读锁."); readLock.unlock(); } }); t2.start();
위 프로그램의 실행 결과는 다음과 같습니다.
1.2 읽기 및 쓰기 상호 배제
읽기 잠금과 쓰기 잠금은 상호 배타적입니다( 즉, 동시에 얻을 수 없음) 동시에 사용하는 것을 다음 코드와 같이 read Write 상호 배제라고 합니다.
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); // 创建写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); // 使用读锁 Thread t1 = new Thread(() -> { readLock.lock(); try { System.out.println("[t1]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放读锁."); readLock.unlock(); } }); t1.start(); // 使用写锁 Thread t2 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t2]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放写锁."); writeLock.unlock(); } }); t2.start();
위 프로그램 실행 결과는 다음과 같습니다.
1.3 쓰기 쓰기 상호 배제
쓰기 잠금을 동시에 사용하는 여러 스레드도 상호 배타적이며, 이를 쓰기 및 쓰기 상호 배제라고 하며 다음 코드에서 볼 수 있습니다.
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); Thread t1 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t1]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放写锁."); writeLock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t2]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放写锁."); writeLock.unlock(); } }); t2.start();
실행 결과
위 내용은 Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!