>  기사  >  Java  >  Java 읽기-쓰기 잠금을 사용하는 방법

Java 읽기-쓰기 잠금을 사용하는 방법

王林
王林앞으로
2023-04-23 22:46:231431검색

1. 공정한 선택성, 불공평하고 공정한 잠금 획득을 지원하며 불공평한 처리량이 공정한 것보다 낫습니다.

2. 재진입, 읽기 잠금 및 쓰기 잠금 모두 스레드 재진입을 지원합니다.

3. 잠금 다운그레이드는 쓰기 잠금 획득, 읽기 잠금 획득, 쓰기 잠금 해제 순으로 진행됩니다. 쓰기 잠금은 읽기 잠금으로 다운그레이드될 수 있습니다.

인스턴스

public class ReadWriteLockTest {
    public static void main(String[] args) {
 
        final Queue q = new Queue();
 
        for (int i = 0; i < 3; i++) {
 
            new Thread() {
                @Override
                public void run() {
 
                    while (true) {
                        q.get();
                    }
                }
            }.start();
 
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        q.put(new Random().nextInt(10000));
                    }
                }
            }.start();
        }
    }
}
 
class Queue {
 
    //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
    ReadWriteLock rwl = new ReentrantReadWriteLock();
    private Object data = null;//共享数据,只能有一个线程能写数据,但可以有多个线程读该数据
 
    public void get() {
        //上读锁,其他线程只能读不能写
        rwl.readLock().lock();
        try {
 
            System.out.println(Thread.currentThread().getName() + " be ready to read data!");
            Thread.sleep((long) (Math.random() * 1000));
            System.out.println(Thread.currentThread().getName() + " have read data :" + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwl.readLock().unlock();
        }
    }
 
    public void put(Object data) {
        //上写锁,不允许其他线程读也不允许写
        rwl.writeLock().lock();
 
        try {
            System.out.println(Thread.currentThread().getName() + " be ready to write data!");
 
            Thread.sleep((long) (Math.random() * 1000));
 
            this.data = data;
            System.out.println(Thread.currentThread().getName() + " have write data: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwl.writeLock().unlock();
        }
    }
}

위 내용은 Java 읽기-쓰기 잠금을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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