ReentrantReadWriteLock具体例子
(一)ReentrantReadWriteLock类实现ReadWriteLock接口; 实现了lock();unlock()方法。
1.0 可调用读锁的lock(),unlock()方法;
2.0 也可调用写锁的lock(),unlock()方法。
(二)代码:
eg:
public class TestReadWriteLock { public static void main(String[] args) { final Queue3 q3 = new Queue3(); for (int i = 0; i < 4; ++i) { new Thread() { public void run() { while (true) { q3.get(); } } }.start(); } for (int i = 0; i < 4; ++i) { new Thread() { public void run() { while (true) { q3.put(new Random().nextInt(10000)); } } }.start(); } } } class Queue3 { //共享数据,只能有一个线程 写数据,但可以 多个线程读数据 private Object data = null; private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); public void get() { rwl.readLock().lock();//上读锁,其他线程只能读。 System.out.println(Thread.currentThread().getName() + "准备好读取 data!"); try { Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println(Thread.currentThread().getName() + "已经读到了data "+data); rwl.readLock().unlock();//释放读锁,最好放在finally里面 } } public void put(Object data) { rwl.writeLock().lock();//加上写锁,不允许其他线程 读写 System.out.println(Thread.currentThread().getName() + "准备好写 data!!"); try { Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } finally { this.data=data; System.out.println(Thread.currentThread().getName() + "已经写好了 data!! "+data); rwl.writeLock().unlock();//释放锁 } } }
结果展示:
结果分析:读锁 可有多个线程 同时读,但不可写。写锁,只能一个线程写,同时不可读。