示例代码
package com.cwj.test410;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReentrantReadWriteLockDemo {
public static void main(String[] args) {
RRWCount count = new RRWCount();
for (int i = 0; i < 3; i++) {
new Thread() {
public void run() {
count.put();
}
}.start();
}
for (int i = 0; i < 3; i++) {
new Thread() {
public void run() {
count.get();
}
}.start();
}
}
}
class RRWCount {
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void get() {
readWriteLock.readLock().lock();// 上读锁,其他线程不能写,具有高并发性
try {
System.out.println(Thread.currentThread().getName() + "get start");
Thread.sleep(1000l);
System.out.println(Thread.currentThread().getName() + "get end");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();// 释放读锁
}
}
public void put() {
readWriteLock.writeLock().lock();// 获取写锁,具有阻塞性
try {
System.out.println(Thread.currentThread().getName() + "put start");
Thread.sleep(1000l);
System.out.println(Thread.currentThread().getName() + "put end");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();// 释放写锁
}
}
}
运行结果
Thread-1put start
Thread-1put end
Thread-0put start
Thread-0put end
Thread-2put start
Thread-2put end
Thread-4get start
Thread-3get start
Thread-5get start
Thread-4get end
Thread-5get end
Thread-3get end
ReentrantReadWriteLock和ReentrantLock
相同点:都是一种显示锁,手动枷锁和解锁,都很适合高并发场景
不同点:ReentrantReadWriteLock是对ReentrantLock的复杂扩展,能适合更加复杂的业务场景,ReentrantReadWriteLock可以实现一个方法中读写分离的锁的机制,而ReentrantLock加解锁只有一种机制