并发容器(一)—线程安全的Map

几种线程安全的Map解析,冲刺7天拿下Offer! 4 年经验应该具备哪些技能 首先,简单的聊一下我认为的 4 年经验左右、优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。 专业技能方面 基础:JDK 常用类的原理、源码、使用场景。 设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。 数据结构:数组、链表、栈、队列、树。 网络:TCP、HTTP、HTTPS、负载均衡算法。 框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心 阅读详情

相信大家都使用过HashMap、ArrayList等数据结构,在非并发的情况下,它们都能很好的工作,但是一到并发环境,就可能出现各种各样的问题。这是为什么呢?当然,它们是非线程安全的,大家都知道。为什么它们是线程不安全的呢?在并发环境中,我们应该使用什么容器呢?在这里先以HashMap简单介绍。

并发下的HashMap

在并发环境中,我们来看看使用同一个HashMap会出现什么问题呢?示例如下:

public class HashMapDemo {
    static HashMap map = new HashMap();

    public static void main(String[] args) throws InterruptedException {
        Thread one = new Thread(new HashMapThread(0));
        Thread two = new Thread(new HashMapThread(1));
        one.start();
        two.start();
        one.join();
        two.join();
        System.out.println(map.size());
    }
}
class HashMapThread implements Runnable {
    int i;

    public HashMapThread(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        for (int j = i; j < 10000; j += 2) {
            map.put(Integer.toString(j), Integer.toHexString(j));
        }
    }
}

这是一个非常简单的操作HashMap的并发测试,从上述代码来看,我们的预期结果应该是10000,然而实际上的结果确并非如此,本人在JDK1.8的环境下运行,得到过如下几种结果:

1.程序运行正常,结果<10000。

2.程序出现异常,java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to java.util.HashMap$TreeNode。

至于结果为10000,我这里一次都没有得到过,汗颜...。这是为什么呢?不应该是10000吗?当然,我也非常好奇,所以看了一下put源码,看看究竟为何。

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
               boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    //判断table是否为空
    if ((tab = table) == null || (n = tab.length) == 0)
        
同步类容器和并发类容器 一.为什么会出现同步容器? 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大类容器。 像ArrayList、LinkedList都是实现了List接口,HashSet实现了Set接口,而Deque(双向队列,允许... 阅读详情

相关推荐

C++技术之路:线程安全的map容器

多线程环境下,我们如果用到map容器,我们就需要对map加锁。我们直接上代码,记录下我平时的代码。 template< typename K, typename D > class CStlClassMapLock { public: CStlClassMapLock() { } virtual ~CStlClassMapLock() { this->TsClear();...

slyw77slyw的博客 2373

并发编程之并发容器(Map、List、Set)实战及其原理

并发容器(Map、List、Set)实战及其原理

2201_75955594的博客 934

并发编程实战-为什么需要线程安全的容器

本文中我们给线程安全明确了定义,即“当多个线程访问某个类时,这个类始终能表现出正确的行为,那么这个类就是线程安全的”。了解了容器的分类,最重要的是以ArrayList为例探究了普通容器在多线程环境下会发生什么?以及线程安全的容器在多线程环境下是否是正确的。

mmayanshuo的博客 1023

并发中的Map容器

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。   上几篇讨论了并发环境下list容器的操作, 本篇我们来聊下另外一个集合容器:Map 家族体系 Map:以key-value对的形式存在,一种数据结构,一个key, 映射一个value值, map中不能包含重复的key值, 一个key最多只能映射到一个值。 常用方法有: 添加: V put(K key, V value); 删除...

wolfcode_cn的博客 462

Java并发容器总结

Java容器并发管理探究 文章主要探讨Java中Map容器的并发问题,重点分析JDK7版本HashMap的实现机制及潜在并发风险。 JDK7 HashMap核心机制 数据结构:数组+链表,采用头插法处理哈希冲突 扩容过程:创建新数组后通过transfer方法迁移元素,使用头插法重新排列链表 并发扩容风险 多线程环境下扩容时可能出现循环链表问题: 线程A和线程B同时扩容 头插法操作导致节点相互引用 后续查询操作触发无限循环,造成CPU 100% 该问题源于JDK7版本的非线程安全设计,后续版本通过改进数据结构

禅与计算机程序设计的艺术 2170

全国职业院校技能大赛-大数据应用赛项-数据挖掘-01

-----------------------推荐Top5结果如下--------------------------------------------第一条数据前10列结果展示为:----------------------------------------相同种类前10的id结果展示为:--------------------相似度top5(商品id:14,平均相似度:0.522356)相似度top1(商品id:1,平均相似度:0.983456)若属于该spu_id,则内容为1否则为0。

Eternity_04的博客 1956

十一、学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

ungoing的博客 8991

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1546

从SN65HVD230芯片手册出发,手把手教你搞定3.3V CAN收发器电路(附典型应用图)

本文详细解析TI SN65HVD230芯片手册,指导完成3.3V CAN收发器电路设计。从关键参数解读到基础电路搭建,再到高级功能实现与EMC优化,提供完整的接口电路设计方案,并附典型应用图和故障排查指南,助力开发者提升CAN总线通信质量。

weixin_29997523的博客 516

【电路设计实战】BUCK降压电路:从原理到PCB布局的降噪与效率优化

本文深入剖析了BUCK降压电路的工作原理,并针对其固有的开关噪声问题,提供了从核心元件选型到PCB布局的全面优化方案。文章重点探讨了电感、电容等关键元件的选型要点,强调了低ESR电容和肖特基二极管的重要性,并详细阐述了如何通过最小化功率回路、保护敏感信号线等PCB布局实战技巧,有效抑制噪声、提升效率与稳定性。

weixin_29304021的博客 227

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 373

汇川H5U PLC 实现直线插补、圆弧插补、直线圆弧混合连续插补

使用汇川H5UPLC实现直线插补,圆弧插补,直线圆弧混合路径插补,通过示教可以走出复杂的路径,仅供参考学习。

weixin_39832501的博客 4788

多模态脑区细分图谱 HCP-MMP v1.0, Glasser et al. 2016 皮层和皮下区域,简写和全称对应关系

人类连接组计划多模态脑区细分图谱(HCP-MMP)提供了对人类大脑皮层区域的非常有用的细分(Glasser et al. 2016a, b)。图谱是多模态的,因为每个区域都是根据四个标准的组合定义的,包括结构(T1加权/T2加权髓鞘含量和皮层厚度图)、静息态功能连接、基于任务的激活和拓扑地形组织。HCP-MMP v1.0图谱包含每个半球180个皮层区域,基于210名参与者的分析。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2624

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 线程池-Executors
下一篇: 并发容器(二)—线程安全的List
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值