java 中用 ReentrantReadWriteLock 解决HashMap() 线程安全问题

news2024/11/24 18:58:54

在并发编程中,当多个线程同时操作一个 变量时,容易出现线程安全的问题,我们可以使用各种锁来解决线程安全问题,比如:ConcurrentHashMap 在底层使用了synchronized 解决 HashMap()的线程安全问题, 我们这里希望使用 ReentrantReadWriteLock 来解决HashMap 的线程安全问题。

ConcurrentHashMap 使用 synchronized 解决线程安全,在putVal 方法中

ReentrantReadWriteLock 

构造方法

调用无参构造方法后,默认会调用非公平锁构造方法,并初始化 读锁和写锁。

private ReadWriteLock lock = new ReentrantReadWriteLock();

然后我们可以调用 读锁和写锁 分别对 hashmap 进行 写入和读取, 代码如下:

1、类中我们 定义了全局的 HashMap, 对它的操作是非线程安全的

2、初始化了ReentrantReadWriteLock,并调用了 readLock 和 writeLock 方法

3、在set 方法调用了 wlock.lock(), get 方法调用了 rlock.lock();

4、创建一个固定线程池,启动800个线程去并发操作,本例使用springboot 进行单元测试。

package com.yy.dd;

import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class RWLockTest {

    private ReadWriteLock lock = new ReentrantReadWriteLock();

    private Lock rlock = lock.readLock();

    private Lock wlock = lock.writeLock();

    private static Map<String, String> map = new HashMap<>();

    @Test
    public void rwtest() throws InterruptedException {
        ExecutorService exec = Executors.newFixedThreadPool(800);
        for (int i = 0; i < 800; i++) {
            exec.execute(new Runnable() {
                @Override
                public void run() {
                    setMap(String.valueOf(Thread.currentThread().getId()), Thread.currentThread().getName());
                }
            });
        }
        exec.shutdown();

        TimeUnit.SECONDS.sleep(2);
        System.out.println("map中元素总和:" + map.size());
        System.out.println("finished");
    }

    public void setMap(String key, String value) {
        wlock.lock();
        try {
            map.put(key, value);
        } finally {
            wlock.unlock();
        }
    }

    public String getMap(String key) {
        rlock.lock();
        try {
            return map.get(key);
        } finally {
            rlock.unlock();
        }
    }

    public void remove(String key) {
        wlock.lock();
        try {
            map.remove(key);
        } finally {
            wlock.unlock();
        }
    }
}

加锁后的操作结果,读写锁保证了线程的安全:

map中元素总和:800
finished

注释掉锁后,再来执行一次,没有锁的情况下,map总和只有793,出现了脏数据。

map中元素总和:793
finished 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三维模型OBJ格式轻量化压缩在移动智能终端应用方面的重要性分析

三维模型OBJ格式轻量化压缩在移动智能终端应用方面的重要性分析 三维模型的OBJ格式轻量化压缩在移动智能终端应用方面具有重要性。以下是对三维模型OBJ格式轻量化压缩在移动智能终端应用方面重要性的分析&#xff1a; 1、资源受限的环境&#xff1a;移动智能终端如手机、平板等…

【校招VIP】产品分析之功能分析

考点介绍&#xff1a; 作为一个产品经理&#xff0c;从需求分析到功能实现&#xff0c;一步都不能错过&#xff0c;不断调整不断沟通&#xff0c;以期达到最好的效果。 『产品分析之功能分析』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点题目 1. 拼多多…

Python中异步编程是什么意思? - 易智编译EaseEditing

异步编程是一种编程模式&#xff0c;用于处理可能会导致程序等待的操作&#xff0c;例如网络请求、文件读写或长时间的计算任务&#xff0c;而不会阻塞整个程序的执行。 在传统的同步编程中&#xff0c;当程序执行一个耗时的操作时&#xff0c;它会等待该操作完成&#xff0c;…

[Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM

[Qt开发探幽&#xff08;二&#xff09;]深入浅出关于元对象&#xff0c;宏和Q_ENUM [Qt开发探幽&#xff08;二&#xff09;]深入浅出关于元对象&#xff0c;宏和Q_ENUM前言一、元对象但是 二、关于Q_OBJECT等宏属性1.元对象系统2.信号与槽3.属性系统 三、关于Q_ENUMS1.将其注…

让文字会说话,启英泰伦离线语音合成(TTS)技术全面升级!

• A01&#xff0c;请用餐 • 请001号到03号窗口办理业务 • 本次列车即将到达火车南站&#xff0c;请提前准备下车 语音合成&#xff08;TTS&#xff09;技术作为人工智能领域的一项重要技术&#xff0c;已经深入大众生活&#xff0c;无孔不入。通过将文字转化为生动自然的…

伦敦银杠杆怎么用才对?

在了解伦敦银这个投资方式后&#xff0c;投资者应该明白它是怎样的高杠杆的品种&#xff0c;能够为自己带来多高的回报&#xff0c;然而杠杆的作用是双向的&#xff0c;如果使用不当&#xff0c;对投资者的损害同样也会很大。那么伦敦银的杠杆&#xff0c;到底怎么使用才对呢&a…

如何优化 SketchUp 性能并避免卡顿、崩溃?

SketchUp 是建筑师、工程师、设计师和艺术家使用的流行 3D 建模软件。然而&#xff0c;随着模型变得更加复杂&#xff0c;用户可能会遇到延迟甚至崩溃的情况。在本文档中&#xff0c;我们将提供经过验证的技术来帮助您优化 SketchUp 性能并避免这些令人烦恼的问题。 1.使用高效…

Django(7)-项目实战-发布会签到管理系统

本文使用django实现一个简单的发布会签到管理系统 登录功能 模板页面 sign/templates/index.html <!DOCTYPE html> <html> <head><title>Login Page</title> </head> <body><h1>发布会管理</h1><form action=&qu…

js+canvas实现绘制正方形并插入文字,实现文字居中显示。

目录 一、实现效果二、实现思路三、代码实现四、代码解析五、问题六、改进后的代码1.效果图2.思路3.代码实现 一、实现效果 二、实现思路 1.先根据传入的文本内容&#xff0c;计算出文本的宽度。 2.文本宽度左右间距&#xff0c;得到正方形的边长、画布宽度。 3.在&#xff08…

Python数据分析与展示-Numpy

numpy入门 ndarray对象的属性 import numpy as npdef sun():a np.array([1,2,3,4])b np.array([5,6,7,8])c a**2 b**3return cprint(sun())a np.array([[1, 2, 3, 4],[4, 5, 6, 7]])print(a.ndim) print(a.shape) print(a.size) print(a.dtype) print(a.itemsize) ndarra…

vue3-styled-components inject导致死循环

npm: vue3-styled-components - npm 低版本浏览器报错(chrome 49) Uncaught RangeError: Maximum call stack size exceeded [Vue warn]: Avoid app logic that relies on enumerating keys on a component instance, The keys will be empty in production mode to avoid p…

Vue安装过程的困惑解答——nodejs和vue关系、webpack、vue-cli、vue的项目结构

文章目录 1、为什么在使用vue前要下载nodejs&#xff1f;2、为什么安装nodejs后就能使用NPM包管理工具&#xff1f;3、为什么是V8引擎并且使用C实现&#xff1f;4、为什么会安装淘宝镜像&#xff1f;5、什么是webpack模板&#xff1f;6、什么是脚手架 vue-cli&#xff1f;6.1 安…

【C++】C++11新特性 lambda表达式

C11新特性 lambda表达式1、引入2、lambda表达式语法3、 捕获列表说明4、 lambda表达式的原理5、 lambda对象的大小 lambda表达式 1、引入 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法&#xff0c;如果待排序元素为自定义类…

前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)

一、在一个页面&#xff08;不跨页面&#xff09; 效果&#xff1a; 代码 <!DOCTYPE html> <html><head><style>/* 设置标签页外层容器样式 */.tab-container {width: 100%;background-color: #f1f1f1;overflow: hidden;}/* 设置标签页选项卡的样式 …

Synchronized 锁升级的原理

问题解析 Synchronized 在 jdk1.6 版本之前&#xff0c;是通过重量级锁的方式来实现线程之间锁的竞争。 之所以称它为重量级锁&#xff0c;是因为它的底层依赖操作系统的 Mutex Lock 来实现互斥功能。 如下图所示&#xff0c; Mutex 是系统方法&#xff0c;由于权限隔…

【数据分析】使用Python对数据的操作转换

使用Python对数据的操作转换 目录 1、列表加值转字典2、字典键新增值数据3、转换新的字典格式4、两组数据比较筛选5、将两段独立代码合并1、列表加值转字典 在Python中&#xff0c;将列表的值转换为字典的键可以使用以下代码&#xff1a; #!/usr/bin/env python # -*- cod…

详细教程-Chatbot具体需要如何搭建

最近建设企业专属的帮助中心或者博客是很流行的趋势&#xff0c;尤其是在AI功能的介入下&#xff0c;可以帮到企业和用户进行更自助的操作。但是很多企业会遇到以下问题&#xff1a;我们已经有了一个原有的知识库了&#xff0c;再建设一个新的需要把数据迁移。这个操作很麻烦和…

科技资讯|微软获得AI双肩包专利,Find My防丢背包大火

根据美国商标和专利局&#xff08;USPTO&#xff09;近日公示的清单&#xff0c;微软于今年 5 月提交了一项智能双肩包专利&#xff0c;其亮点在于整合了 AI 技术&#xff0c;可以识别佩戴者周围环境、自动响应用户聊天请求、访问基于云端的信息、以及和其它设备交互。 在此附…

单片机电子元器件-按键

电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关&#xff0c;开关在闭合不会马上稳定的接通&#xff0c;会有一连串的抖动 抖动时间的长短有机械特性来决定的&#xff0c;一般为5ms 到10 ms 。 消抖的分类 硬件消…

LSM树详解

LSM树(Log-Structured-Merge-Tree)的名字往往会给初识者一个错误的印象&#xff0c;事实上&#xff0c;LSM树并不像B树、红黑树一样是一颗严格的树状数据结构&#xff0c;它其实是一种存储结构&#xff0c;目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树。 LSM树的核…