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 中国語 Web サイトの他の関連記事を参照してください。