>  기사  >  Java  >  Java의 동시 프로그래밍에서 읽기-쓰기 잠금은 어떻게 사용됩니까?

Java의 동시 프로그래밍에서 읽기-쓰기 잠금은 어떻게 사용됩니까?

PHPz
PHPz원래의
2024-05-01 17:12:011106검색

읽기-쓰기 잠금은 여러 스레드가 공유 리소스를 동시에 읽을 수 있도록 허용하지만 한 번에 하나의 스레드만 쓸 수 있는 동시성 제어 메커니즘입니다. 주로 읽기 집약적인 워크로드와 산발적인 쓰기가 있는 애플리케이션에 사용됩니다. Java에서는 java.util.concurrent.locks.ReadWriteLock 인터페이스를 사용하여 읽기-쓰기 잠금을 구현할 수 있습니다. 여기서 읽기 잠금은 읽기 액세스를 허용하고 쓰기 잠금은 쓰기 액세스를 허용합니다. 예를 들어, 공유 카운터에서는 여러 스레드가 카운터 값을 동시에 읽을 수 있으며, 쓰기 스레드는 쓰기 원자성과 데이터 무결성을 보장하기 위해 카운터를 업데이트하기 위해 쓰기 잠금을 획득해야 합니다.

Java 中的读写锁如何用于并发编程?

Java의 읽기-쓰기 잠금은 동시 프로그래밍에 사용됩니다

소개

읽기-쓰기 잠금은 여러 스레드가 공유 리소스를 동시에 읽을 수 있도록 허용하는 동시성 제어 메커니즘이지만 한 번에 하나의 스레드만 쓸 수 있습니다. 시간 공유 리소스를 입력하세요. 이는 읽기 집약적인 작업 부하와 간헐적인 쓰기 작업이 있는 애플리케이션에 유용합니다.

뮤텍스 잠금과 달리 읽기-쓰기 잠금을 사용하면 여러 독자가 공유 리소스에 동시에 액세스할 수 있고 작성자는 리소스에 독점적으로 액세스할 수 있습니다.

Java에서 읽기-쓰기 잠금 사용

Java의 java.util.concurrent.locks.ReadWriteLock 인터페이스는 읽기-쓰기 잠금 기능을 제공합니다. 여기에는 두 가지 유형의 잠금이 있습니다.

  • 읽기 잠금: 스레드가 공유 리소스에 대한 읽기 액세스 권한을 얻을 수 있도록 허용합니다.
  • 쓰기 잠금: 스레드가 공유 리소스에 대한 쓰기 액세스 권한을 얻을 수 있도록 허용합니다.

다음은 읽기-쓰기 잠금 사용의 예입니다.

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedResource {

    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private int value;

    public void read() {
        lock.readLock().lock();
        try {
            // 读取共享资源
            System.out.println("Reading: " + value);
        } finally {
            lock.readLock().unlock();
        }
    }

    public void write(int newValue) {
        lock.writeLock().lock();
        try {
            // 写入共享资源
            value = newValue;
            System.out.println("Writing: " + value);
        } finally {
            lock.writeLock().unlock();
        }
    }
}

실용 사례

단 하나의 스레드만 업데이트하는 동안 여러 스레드가 카운터 값을 읽는 공유 카운터를 생각해 보세요. 동시 액세스 중에 데이터 무결성을 보장하기 위해 읽기-쓰기 잠금을 사용할 수 있습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CounterExample {

    private final SharedResource counter = new SharedResource();
    private final ExecutorService executor = Executors.newFixedThreadPool(10);

    public void run() {
        // 创建 10 个读取线程
        for (int i = 0; i < 10; i++) {
            executor.submit(counter::read);
        }

        // 模拟写入线程
        for (int i = 0; i < 100; i++) {
            executor.submit(() -> counter.write(i));
        }

        executor.shutdown();
    }

    public static void main(String[] args) {
        new CounterExample().run();
    }
}

이 예에서는 여러 읽기 스레드가 카운터 값을 동시에 읽을 수 있는 반면 쓰기 스레드는 카운터에 액세스하기 전에 쓰기 잠금을 획득합니다. 이는 쓰기 작업의 원자성과 데이터 무결성을 보장합니다.

위 내용은 Java의 동시 프로그래밍에서 읽기-쓰기 잠금은 어떻게 사용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.