>  기사  >  Java  >  Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?

Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?

WBOY
WBOY앞으로
2023-04-20 15:25:08846검색
머리말:

Readers-Writer 잠금은 이름에서 알 수 있듯이 읽기 잠금과 쓰기 잠금의 두 부분으로 나누어진 잠금입니다. 읽기 잠금을 사용하면 여러 스레드가 동시에 잠금을 획득할 수 있습니다. 작업 자체는 스레드로부터 안전하며, 쓰기 잠금은 여러 스레드가 동시에 쓰기 잠금을 얻는 것을 허용하지 않는 상호 배타적 잠금이며, 쓰기 작업과 읽기 작업도 상호 배타적입니다. 요약하면 읽기-쓰기 잠금의 특징은 다음과 같습니다. 읽기와 읽기는 상호 배타적이지 않고, 읽기와 쓰기는 상호 배타적이며, 쓰기와 쓰기는 상호 배타적입니다.

1. 읽기-쓰기 잠금 사용

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();

위 프로그램의 실행 결과는 다음과 같습니다. Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?

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();

위 프로그램 실행 결과는 다음과 같습니다. Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?

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 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?

  • 2. 장점 분석

  • 향상된 프로그램 실행 성능:
  • 어떤 상황에서도 실행을 위해 대기해야 하는 일반 잠금에 비해 여러 읽기 잠금을 동시에 실행할 수 있습니다. , 읽기-쓰기 잠금은 프로그램의 실행 성능을 향상시킵니다.

  • 임시 데이터 읽기 방지:
읽기 잠금과 쓰기 잠금은 상호 배타적인 대기열 실행이므로 읽기 작업에서 절반만 작성된 임시 데이터를 읽지 않도록 보장합니다.

3. 적용 가능한 시나리오 🎜🎜 읽기-쓰기 잠금은 더 많은 읽기와 더 적은 쓰기가 필요한 비즈니스 시나리오에 적합합니다. 이때 읽기-쓰기 잠금은 가장 큰 장점이 있습니다. 🎜

위 내용은 Java 읽기-쓰기 잠금의 사용법과 장점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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