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 중국어 웹사이트의 기타 관련 기사를 참조하세요!