读写锁的好处是读写分离了,如果一个程序大量的操作都是读的话会比重入锁快很多
- 读-读:不互斥,不阻塞
- 读-写:互斥,读时不能写,写不能读
- 写-写:互斥
- -
如果这段代码使用重入锁可能需要20秒
public class ReadWriteLockDemo {
private static ReentrantLock lock=new ReentrantLock();
private static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();
private static ReadLock readLock=readWriteLock.readLock();
private static WriteLock writeLock=readWriteLock.writeLock();
private int value;
public int read(Lock lock) throws InterruptedException{
try {
lock.lock();
Thread.sleep(1000);
return value;
} finally {
lock.unlock();
}
}
public void write(Lock lock,int i) throws InterruptedException{
try {
lock.lock();
Thread.sleep(1000);
System.out.println("writing");
value=i;
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
final ReadWriteLockDemo rwd = new ReadWriteLockDemo();
Runnable read = new Runnable() {
@Override
public void run() {
try {
System.out.println(rwd.read(readLock));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Runnable write = new Runnable() {
@Override
public void run() {
try {
rwd.write(writeLock, new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
for (int i = 0; i < 18; i++) {
new Thread(read).start();
if(i==5){
new Thread(write).start();
}
}
}
}