`

HashMap的非线程安全例子

阅读更多

HashMap在多线程访问时存在线程安全问题,举例如下,此例是用HashMap来记录Meeting的状态:

 

线程一在12:12:10put一个meetingKey, meetingStatus(123859963,InProgress)

线程二在12:12:11put一个meetingKey,(123859963,Close)

 

如果没有锁,则线程1和线程二能够同时put,如果线程二在线程一put过程中,先将HashMap(123859963,Close),注意此时,线程一继续运行,线程一会把线程二已经设置好的meeting 状态由close又改成了InProgress,这样meeting状态就不对了。

 

如果加上锁,则没有问题,因为线程一先拿到锁,直到put执行完以后,线程二才能拿到锁,执行Close操作。因此不存在线程安全问题。而保证HashMap线程安全

 

而ConcurrentHashMap不存在这个问题,它使用了锁分离技术,对于不同的Hash值,可以并发的写,对于相同的Hash值,映射在同一个segment上,所有落在这个segment上的数据,是由有读写锁进行控制的。

 

然而ConcurrentHashMap也不能保证强一致性,所谓的强一致性指的是,读者总是能够读到写者最新修改后的数据,而最终一致性指的是读者在某个最终状态能够读到写者写进去的数据,举例如下:

 

ConcurrentHashMap读和写没有使用读写锁进行互斥,当thread1读(123859963,InProgress),Thread2 put了新的数据(123859963,Close),而当读操作完成时,依然读到的是老的数据,这个就是不能读到最新修改的数据。

 

分享到:
评论

相关推荐

    通过代码证明HashMap是线程不安全的(只用了一个Java文件)

    NULL 博文链接:https://flyfoxs.iteye.com/blog/1198030

    面试官问你HashMap底层你用线程安全吊打他

    我们可以先从底层实现说起,HashMap是通过hash算法,基于数组、链表和红黑树实现的,hash算法是一种思想,只要符合该思想的算法都是hash算法,其核心就是给定一个key,通过hash可以对应一个h(key),举个例子就是当...

    superhash-go:支持使用任何类型的一个或多个键的线程安全哈希映射

    支持使用任何类型的一个或多个键的线程安全哈希映射 安装 $ go get esco/superhash-go 例子 import ( "github.com/esco/superhash" ) hashmap := superhash . New () k1 , k2 , k3 , value := 1 , true , "3" , 4 ...

    哈希表类_汇编版(HashMap_ASM) 支持自定义数据值

    3. 非线程安全,多线程需要加锁.更新说明:。0.7版(2018.12.13)。1) 添加 自定义数据值 直接取指针的用法例子.2) 修改 添加() 方法返回值 变更为 整数型(0=添加失败 1=成功添加 2=覆盖)。3) 修复 类为全局变量时...

    Java编程实践:10个实用例子助您提升技能正则表达式、文件操作、日期和时间处理、数据结构、集合类、接口和多态、递归、多线程编程

    1. 使用正则表达式验证邮箱格式:演示如何使用正则表达式验证邮箱地址的格式是否有效。...10. 多线程编程:创建和启动线程:展示了如何通过实现Runnable接口创建一个新线程,并演示了多线程编程的基本概念。

    进销存系统文档作业例子

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    java7hashmap源码-Rebuild-Java:再度重修JAVA

    着重看集合,IO,多线程 泛型例子-->来自java编程思想--P397 Holder.java CovariantArrays.java Wildcards.java Java7文件是来自《Java 7 并发编程实战手册》的里面代码练习 LintCOde文件夹是在刷刷的题目,练练...

    ThreadLocal源码分析和使用

    ThreadLocal 源码分析和使用 ThreadLocal 是 Java 语言中的一种多线程编程机制,用于...在这个例子中,我们使用 ThreadLocal 来实现一个序列号生成器,每个线程都可以独立地生成序列号,而不会受到其他线程的影响。

    RiteRaft - 适用于普通人的 raft 框架

    Bellow 是一个HashStore的例子,它是一个围绕HashMap的线程安全包装器:/// convienient data structure to pass Message in the raft #[derive(Serialize, Deserialize)]pubenumMessage { Insert { key:u64 , ...

    易语言-哈希表类_汇编版(HashMap_ASM) 支持自定义数据值

    3. 非线程安全,多线程需要加锁. 更新说明: 0.7版(2018.12.13) 1) 添加 自定义数据值 直接取指针的用法例子. 2) 修改 添加() 方法返回值 变更为 整数型(0=添加失败 1=成功添加 2=覆盖) 3) 修复 类为全局变量时异常...

    用友公司Java面试题(含答案)

    这意味着在多线程应用程序中,Hashtable 不需要额外的同步,而 HashMap 需要。 * Hashtable 的 hash 数组默认大小是 11,增加的方式是 old*2+1,而 HashMap 中 hash 数组的默认大小是 16,且一定是 2 的指数。 * ...

    动力节点Java基础301集_史上最全的Java基础教程

    3:String创建几个对象,这个可以说全网最牛,不过例子举的有点猥琐,总是讲小哥哥与小姐姐的故事。 4: 源码分析分析讲的特别到位,尤其是HashMap的工作原理和源码分析,真正的把jdk源码翻了一遍,要是拿着这个去面试...

    leetcode下载-study:学习笔记

    数据库死锁例子 JAVA 并发 AQS 源码 ReentrantLock 源码 Condition 源码 ConcurrentHashMap 源码 Java 线程状态 JAVA 数据结构 Queue HashMap HashTable ConcurrentHashMap JAVA IO Go Redis Redis Cluster Redis ...

    Java JDK实例宝典

    11 HashMap. Hashtable. LinkedHashMap和TreeMap 4. 12 对Map排序 4. 13 Properties属性文件 第5章 字符串 5. 1 使用String 5. 2 基本数据类型与字符串的转化 5. 3 判断Java标识符 5. ...

    java jdk实列宝典 光盘源代码

    java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    内部使用的是一个HashMap集合key值当做我们存储的对象,value值是一个固定的Object对象 保证唯一性:元素hashCode和equals方法。hashCode方法相同,判断equals方法 ---LinkedHashSet: 有序,是HashSet的子类 2....

    Java服务器端开发面试.doc

    NIO(通道,缓冲区,选择器) Java服务器端开发面试题篇2 thread, start(), run() 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口 线程状态,上下文切换,守护线程 消费者和生产者的几种实现方式,...

    疯狂JAVA讲义

    学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 ...

    derive_aktor:生成Rust actor的宏

    这与许多参与者实现相反: a)不要强制消息的类型安全b)公开用于与参与者进行通信的单个API,例如“发送”,并强迫您构造消息例子这是“ KeyValueStore”的一个简单示例。 我们可以异步地与之交互,在线程之间共享...

    javaSE代码实例

    17.7 线程安全的单变量操作 403 17.7.1 atomic包简介 403 17.7.2 atomic包中类的具体使用 404 17.8 障碍器 406 17.8.1 CyclicBarrier类简介 406 17.8.2 CyclicBarrier类的具体使用 407 ...

Global site tag (gtag.js) - Google Analytics