`

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文件)

    然而,`HashMap`在并发环境下并非线程安全。这个主题通常涉及到多线程编程和Java集合框架的基础知识。本篇文章将通过分析`HashMap`的源码以及编写一个简单的测试程序来证明这一点。 首先,我们要理解什么是线程安全...

    servlet线程安全问题

    2. 使用线程安全的对象:使用线程安全的对象,如 Vector、Hashtable 等,而不是 ArrayList、HashMap 等。 3. 使用锁机制:使用锁机制,如 synchronized 关键字,可以锁定某个对象,以避免多个线程同时访问同一个对象...

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    #### 二、HashMap线程安全问题分析 在多线程环境中,`HashMap`的主要线程安全问题包括但不限于: 1. **链表死循环问题**:在JDK 1.7中,当多个线程同时进行`put`操作时,可能会出现链表死循环的情况,这是一个严重...

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

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

    java 多线程的一个例子java 多线程的一个例子

    2. `preEntities`:一个`HashMap`,存储了线程ID与其依赖的线程对象的映射,用于表示线程间的依赖关系。 3. `process`:一个`Thread`对象,表示`ThreadEntity`对应的线程实例。 4. `ready`:一个布尔值,表示线程...

    枚举 HashMap

    虽然HashMap不是线程安全的,但在单线程环境下使用或配合同步机制(如`synchronized`关键字或`Collections.synchronizedMap()`)可以保证安全性。 以下是一个简单的示例,展示了如何用HashMap实现枚举功能: ```...

    Spring并发访问的线程安全性问题.docx

    解决办法是使用`Collections.synchronizedMap()`来同步HashMap,或者使用`ConcurrentHashMap`,这是一种专门为多线程环境设计的线程安全的Map实现。 ```java @Service("userService") Class UserService{ public ...

    HashMap CRUD操作

    HashMap不是线程安全的,如果在多线程环境下使用,需要额外的同步控制。 **2. 创建(Create)** 创建HashMap对象非常简单,只需要调用构造函数即可: ```java HashMap, Product> productMap = new HashMap(); ``` ...

    深入了解JAVA HASHMAP的死循环

    在Java编程中,HashMap是一个广泛使用的数据结构,它实现了Map接口,基于哈希表实现,提供了高效的键值对存储和...程序员应当养成良好的编程习惯,尽量减少对非线程安全数据结构的并发使用,尤其是在性能敏感的场景下。

    Java线程实现与安全

    4. 线程兼容:如ArrayList和HashMap,需要外部同步保证线程安全。 5. 线程对立:无法在多线程环境中安全使用的数据。 确保线程安全的方法包括使用`synchronized`关键字实现互斥同步,通过监视器(monitorenter/...

    java后端面试题答案.pdf

    这个过程可以通过一个例子来形象说明:假设有两个线程同时向同一个HashMap中添加元素,由于HashMap不保证同步,所以可能会出现线程A添加的数据被线程B覆盖的情况。 谈到HashMap的扩容机制,当容器中的元素数量达到...

    多线程编程系列

    在多线程环境下,传统的数据结构(如ArrayList、HashMap)可能引发线程安全问题。为此,Java提供了一系列并发容器(如ConcurrentHashMap、CopyOnWriteArrayList),它们内部实现了线程安全的机制,可以在多线程环境...

    【技术分享】Java中的那些“锁”事.pptx

    - `HashMap`:非线程安全,多线程环境下可能导致数据不一致。 - `HashTable`:线程安全,但效率较低,因为所有操作都是同步的。 - `ConcurrentHashMap`:线程安全,设计为高并发环境下的高效选择。 - `List`(如`...

    java程序 两个线程实现学生成绩的读写

    Java程序中的多线程技术是实现并发...总的来说,这个Java程序展示了如何在并发环境中处理读写操作,是理解和实践Java多线程的一个好例子。通过学习这个程序,我们可以深入理解Java线程的使用以及并发编程中的核心概念。

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    在多线程环境下,共享数据通常会引发线程安全问题,比如上述例子中的“张三给李四转钱”场景,如果两个线程同时操作同一个对象,不加控制可能会导致数据混淆,造成错误。为了解决这个问题,我们可以使用线程局部变量...

    Java 中的HashMap详解和使用示例_动力节点Java学院整理

    HashMap是Java编程语言中常用的集合类之一,它提供了一种以键值对形式存储数据的方式。HashMap基于哈希表的数据结构实现,具有...同时,注意HashMap非线程安全,如果需要线程安全的哈希表,可以使用ConcurrentHashMap。

    HashMap遍历

    此外,需要注意的是,`HashMap`并非线程安全的,如果在多线程环境下使用,应考虑同步机制,或使用如`ConcurrentHashMap`等线程安全的替代方案。同时,对于不允许null值的情况,可以选择`LinkedHashMap`或`TreeMap`等...

    阿里云Java实习生面试真题

    这被称为竞态条件,是线程不安全的一个典型例子。 4. **HashMap扩容**: 当HashMap中的元素数量达到其容量(initial capacity)的负载因子(load factor)倍时,HashMap会进行扩容。在JDK1.7中,负载因子默认为0.75...

    java英文笔试面试题.pdf

    `HashTable`就是线程安全的例子,而`HashMap`不是,因此在多线程环境使用`HashMap`时需要考虑同步问题。 9. **并发编程中的同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`wait()`, `notify()`和...

Global site tag (gtag.js) - Google Analytics