什么是读写锁

参考答案

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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧