package com.kxw.thread.concurrent; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Created by kangxiongwei on 2015/7/20. */ public class ReadWriteLockTest { public static void main(String[] args) { final MyQueue queue = new MyQueue(); for (int i=0; i<3; i++) { new Thread(new Runnable() { @Override public void run() { for (int i=0; i<10; i++) { queue.read(); } } }).start(); } for (int i=0; i<3; i++) { new Thread(new Runnable() { @Override public void run() { for (int i=0; i<10; i++) { queue.write(); } } }).start(); } } } class MyQueue { private Object object; private ReadWriteLock rwl = new ReentrantReadWriteLock(); public void read() { rwl.readLock().lock(); try { System.out.println(Thread.currentThread().getName()+" be ready to read"); Thread.sleep((long)Math.random()*10000); System.out.println(Thread.currentThread().getName()+" have read data "+object); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.readLock().unlock(); } } public void write() { rwl.writeLock().lock(); try { System.out.println(Thread.currentThread().getName()+" be ready to write"); Integer data = new Random().nextInt(10000); this.object = data; Thread.sleep((long)Math.random()*10000); System.out.println(Thread.currentThread().getName()+" have write data "+data); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.writeLock().unlock(); } } }