• 系列十、ReentrantReadWriteLock


    一、概述

    ReentrantReadWriteLock是ReadWriteLock的一个子类,具有读锁和写锁的双重功能,通常用于做缓存。

    二、案例代码

    2.1、ReentrantReadWriteLockCache

    1. /**
    2. * @Author : 一叶浮萍归大海
    3. * @Date: 2023/11/20 17:57
    4. * @Description: 使用ReentrantReadWriteLock实现缓存的功能
    5. */
    6. public class ReentrantReadWriteLockCache {
    7. private volatile Map map = new HashMap<>();
    8. private ReadWriteLock rwLock = new ReentrantReadWriteLock();
    9. /**
    10. * 写数据
    11. * @param key
    12. * @param value
    13. */
    14. public void put(String key, Object value) {
    15. rwLock.writeLock().lock();
    16. try {
    17. System.out.println(Thread.currentThread().getName() + "\t正在写" + key);
    18. // 线程休眠,单位:毫秒
    19. try {TimeUnit.MILLISECONDS.sleep(300);} catch (Exception e) {e.printStackTrace();}
    20. map.put(key, value);
    21. System.out.println(Thread.currentThread().getName() + "\t写完了" + key);
    22. System.out.println();
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. } finally {
    26. rwLock.writeLock().unlock();
    27. }
    28. }
    29. /**
    30. * 读数据
    31. * @param key
    32. * @return
    33. */
    34. public Object get(String key) {
    35. rwLock.readLock().lock();
    36. Object result = null;
    37. try {
    38. System.out.println(Thread.currentThread().getName() + "\t正在读" + key);
    39. // 线程休眠,单位:毫秒
    40. try {TimeUnit.MILLISECONDS.sleep(300);} catch (Exception e) {e.printStackTrace();}
    41. result = map.get(key);
    42. System.out.println(Thread.currentThread().getName() + "\t读完了" + result);
    43. } catch (Exception e) {
    44. e.printStackTrace();
    45. } finally {
    46. rwLock.readLock().unlock();
    47. }
    48. return result;
    49. }
    50. }

    2.2、ReentrantReadWriteLockMainApp

    1. /**
    2. * @Author : 一叶浮萍归大海
    3. * @Date: 2023/11/20 18:00
    4. * @Description:
    5. */
    6. public class ReentrantReadWriteLockMainApp {
    7. public static void main(String[] args) {
    8. ReentrantReadWriteLockCache cache = new ReentrantReadWriteLockCache();
    9. for (int i = 1; i <= 5; i++) {
    10. final int number = i;
    11. new Thread(() -> {
    12. try {
    13. cache.put(String.valueOf(number),number);
    14. } catch (Exception e) {
    15. e.printStackTrace();
    16. }
    17. }, String.valueOf(i)).start();
    18. }
    19. for (int i = 1; i <= 5; i++) {
    20. final int number = i;
    21. new Thread(() -> {
    22. try {
    23. cache.get(String.valueOf(number));
    24. } catch (Exception e) {
    25. e.printStackTrace();
    26. }
    27. }, String.valueOf(i)).start();
    28. }
    29. }
    30. }

  • 相关阅读:
    Rxjs map, mergeMap 和 switchMap 的区别和联系
    sql注入总结
    Redis基本操作
    亚太C题详细版思路修改版(精)
    Typora 基本使用操作
    【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数
    Python:乘积尾零
    [组合计数]Counting Stickmen 2022杭电多校第7场 1003
    go-zero微服务实战系列(四、CRUD热热身)
    mysql中count()函数用法:count(1)和count(*)有什么区别?
  • 原文地址:https://blog.csdn.net/HelloWorld20161112/article/details/134515435