ReadWriteLock是一个接口,只有一个实现类ReentrantReadWriteLock
读写锁:读的时候可以多线程同时读,写的时候只能有一个线程单独写,读的时候不允许写
读锁readLock即共享锁
写锁writeLock即独占锁
使用举例:
public class ReadWriteLockTest {
public static void main(String[] args) {
Data data = new Data();
// 多线程同时写
for (int i = 1;i <= 5;i++){
new Thread(()->{
data.write();
},String.valueOf(i)).start();
}
// 多线程同时读
for (int i = 1;i <= 5;i++){
new Thread(()->{
data.read();
},String.valueOf(i)).start();
}
}
}
// 资源类
class Data {
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //创建读写锁
// 写:写的时候只能有一个线程单独写
public void write(){
readWriteLock.writeLock().lock(); // 写锁加锁
try {
System.out.println(Thread.currentThread().getName()+"正在写入");
TimeUnit.SECONDS.sleep(1); // 延时1秒
System.out.println(Thread.currentThread().getName()+"写入结束");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock(); // 写锁解锁
}
}
// 读:读的时候可以多线程同时读
public void read(){
readWriteLock.readLock().lock(); // 读锁加锁
try {
System.out.println(Thread.currentThread().getName()+"正在读取");
TimeUnit.SECONDS.sleep(1); // 延时1秒
System.out.println(Thread.currentThread().getName()+"读取结束");
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock(); // 读锁解锁
}
}
}
结果:
2正在写入
2写入结束
1正在写入
1写入结束
4正在写入
4写入结束
3正在写入
3写入结束
5正在写入
5写入结束
1正在读取
2正在读取
3正在读取
4正在读取
5正在读取
1读取结束
2读取结束
5读取结束
4读取结束
3读取结束