读写锁分为读锁和写锁,多个读锁之间是不需要互斥的(读操作不会改变数据,如果上了锁,反而会影响效率),写锁和写锁之间需要互斥,也就是说,如果只是读数据,就可以多个线程同时读,但是如果你要写数据,就必须互斥,使得同一时刻只有一个线程在操作。
案例:三个线程读数据,三个线程写数据。
class ReadWrite {
/* 共享数据,只能一个线程写数据,可以多个线程读数据 */
private Object data = null;
/* 创建一个读写锁 */
ReadWriteLock rwlock = new ReentrantReadWriteLock();
/**
* 读数据,可以多个线程同时读, 所以上读锁即可
*/
public void get() {
/* 上读锁 */
rwlock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " 准备读数据!");
/* 休眠 */
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName() + "读出的数据为 :" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
rwlock.readLock().unlock();
}
}
/**
* 写数据,多个线程不