参考答案
1. 读写锁的概念
- 读写锁英文全称ReadWriteLock
- ReadWriteLock是一个接口,实现类是ReentrantReadWriteLock
- 读写锁是效率更高的互斥量(在大多数条件下):读写锁分为两种情况,一种是读时的锁,一种是写时的锁,它允许多个线程同时读共享变量,但是只允许一个线程写共享变量,当写共享变量的时候也会阻塞读的操作,在读的时候就不会互斥,提高读的效率。
2. 读写锁的原理
- 允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待。
实例:
public class ReadWriteLockDemo {
public static void main(String[] args) {
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Book book = new Book();//创建一本书,可读可写
//两个写手
for (int i = 0; i < 2; i++) {
int num = i;
new Thread(()->{
try {
readWriteLock.writeLock().lock();
System.out.println("写手"+num+"在写文章");
book.write(String.valueOf(num),UUID.randomUUID().toString().substring(0,5));
}catch (Exception e){
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();
}
},String.valueOf(i)).start();
}
//6个读者
for (int i = 0; i < 6; i++) {
int num = i;
new Thread(()->{
try {
readWriteLock.readLock().lock();
String word = book.read(String.valueOf(num % 2));
System.out.println("读者"+num+"在阅读文章..."+word);
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();
}
},String.valueOf(i)).start();
}
}
}
class Book{
HashMap map = new HashMap<>();
public void write(String key,String val){
map.put(key, val);
}
public String read(String key){
String word = map.get(key);
return word;
}
}
结果:
"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=54141:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\idea_workplace\javaBase\target\classes" 写手0在写文章 写手1在写文章 读者0在阅读文章...6b021 读者1在阅读文章...220e4 读者2在阅读文章...6b021 读者4在阅读文章...6b021 读者3在阅读文章...220e4 读者5在阅读文章...220e4 Process finished with exit code 0
3. 读写锁的效率
- 读写锁是否会提高使用互斥锁的性能,取决于数据被读取的频率与被修改的频率,读取和写入操作的持续时间以及数据的争用 ,尝试同时读取或写入数据的线程数。
- 例如,最初填充数据的集合,之后经常被修改的频繁的搜索(例如某种目录),是使用读写锁的理想候选。 然而,如果更新变得频繁,那么数据的大部分时间将被专门锁定,并且并发性增加很少。
- 此外,如果读取操作太短,则读写锁定实现(其本身比互斥锁更复杂)的开销可以支配执行成本,特别是因为许多读写锁定实现仍将序列化所有线程通过小部分代码。
以上,是Java面试题【什么是读写锁】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—
