ReadWriteLock
ReadWriteLock维护一对关联的licks,一个用于只读操作,一个用于写入,read lock可以由多个阅读线程同时进行,write lock是独家的(可以被多个线程同时读,只能被一个线程写)
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(String str){
//加写锁
readWriteLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"写入"+str);
System.out.println(Thread.currentThread().getName()+"写入成功");
} finally {
//解锁
readWriteLock.writeLock().unlock();
}
}
public void read(){
//加读锁
readWriteLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"读取成功");
} finally {
readWriteLock.readLock().unlock();
}
}
}
执行结果:
1写入---
1写入成功
2写入---
2写入成功
3写入---
3写入成功
4写入---
4写入成功
1读取成功
3读取成功
2读取成功
5写入---
5写入成功
5读取成功
4读取成功
说明: 如果不加读写锁,在写入操作的时候一个线程写入~写入成功之间会被其他线程插队,正常写操作应该是一个原子性操作,不应该被其他线程插队,使用读写锁可以完美解决这个问题