参考答案
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—