概述
ReadWriteLock是一个接口,在它里面只定义了两个方法:一个读的锁和一个写的锁。
读的锁:A线程获取了读的锁,那么B线程也可以获取读的锁。
写的锁:A线程获取了写的锁,那么B线程不能获取读也不能获取写的锁。
public interface ReadWriteLock {/*** Returns the lock used for reading.* 读的锁,A线程获取了读的锁,那么B线程也可以获取读的锁* @return the lock used for reading.*/Lock readLock();/*** Returns the lock used for writing.* 写的锁,A线程获取了写的锁,那么B线程不能获取读也不能获取写的锁。* @return the lock used for writing.*/Lock writeLock();
}
代码
/*** 使用读写锁,可以实现读写分离锁定,读操作并发进行,写操作锁定单个线程* * 如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁。* 如果有一个线程已经占用了写锁,则此时其他线程如果申请写锁或者读锁,则申请的线程会一直等待释放写锁。* @author**/
public class MyReentrantReadWriteLock {private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();public static void main(String[] args) {final MyReentrantReadWriteLock test = new MyReentrantReadWriteLock();new Thread(){public void run() {test.get(Thread.currentThread());test.write(Thread.currentThread());};}.start();new Thread(){public void run() {test.get(Thread.currentThread());test.write(Thread.currentThread());};}.start();} /*** 读操作,用读锁来锁定* @param thread*/public void get(Thread thread) {rwl.readLock().lock();try {long start = System.currentTimeMillis();while(System.currentTimeMillis() - start <= 1) {System.out.println(thread.getName()+"正在进行读操作");}System.out.println(thread.getName()+"读操作完毕");} finally {rwl.readLock().unlock();}}/*** 写操作,用写锁来锁定* @param thread*/public void write(Thread thread) {rwl.writeLock().lock();;try {long start = System.currentTimeMillis();while(System.currentTimeMillis() - start <= 1) {System.out.println(thread.getName()+"正在进行写操作");}System.out.println(thread.getName()+"写操作完毕");} finally {rwl.writeLock().unlock();}}
}
运行结果
读的时候,线程是并行的
写的时候,是单线程的