`
weiqiang.yang
  • 浏览: 156535 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

[Java]关于HashMap的多线程不安全

阅读更多
    HashMap不是多线程安全的,这个貌似大家都知道,但是这是不是意味着,只要在多线程环境下使用到HashMap,那就得套上syncronized呢?
  
引用
Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap  class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.


    HashMap是基于Hash Table的一种Map实现,允许null values和null key(它跟HashTable的区别在于它是非同步的,而且允许null key和null values),HashMap不保证Map的顺序,甚至不能保证Map的顺序在运行过程中保持不变。

   
引用
Note that this implementation is not synchronized. If multiple threads access this map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map:


 Map m = Collections.synchronizedMap(new HashMap(...));


    这种实现不是同步的,如果多个线程同时访问这个Map,而且至少一个线程对Map进行结构性的修改(增加,删除操作,update不算),那么它必须在外部进行同步,通常这种同步是通过包含这个Map的外部对象来实现的,如果该外部对象不存在,那么这个Map需要通过Collections.synchronizedMap来保证同步(最好在创建的时候)。

  
引用
The iterators returned by all of this class's "collection view methods" are fail-fast: if the map is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

    Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.


   话说,没看懂~~
关于fail-fast,中文意思是快速失败,没搜到官方的解释(搜索技术不好?),找到这个问答
http://www.jguru.com/faq/view.jsp?EID=221988

引用
An iterator is considered fail-fast  if it throws a ConcurrentModificationException under either of the following two conditions:
   1. In multithreaded processing: if one thread is trying to modify a Collection while another thread is iterating over it.
   2. In single-threaded or in multithreaded processing: if after the creation of the Iterator, the container is modified at any time by any method other than the Iterator's own remove or add methods.

  
来自ibm developerworks上对java.util.concurrent包的说明片段:
      java.util 包中的集合类都返回 fail-fast 迭代器,这意味着它们假设线程在集合内容中进行迭代时,集合不会更改它的内容。如果 fail-fast 迭代器检测到在迭代过程中进行了更改操作,那么它会抛出 ConcurrentModificationException ,这是不可控异常。
      在迭代过程中不更改集合的要求通常会对许多并发应用程序造成不便。相反,比较好的是它允许并发修改并确保迭代器只要进行合理操作,就可以提供集合的一致视图,如 java.util.concurrent 集合类中的迭代器所做的那样。
     java.util.concurrent 集合返回的迭代器称为弱一致的(weakly consistent)迭代器。对于这些类,如果元素自从迭代开始已经删除,且尚未由 next() 方法返回,那么它将不返回到调用者。如果元素自迭代开始已经添加,那么它可能返回调用者,也可能不返回。在一次迭代中,无论如何更改底层集合,元素不会被返回两次。

   算了,如果多线程用到HashMap,如果不能保证是只读的,还是给它套个syncronized好了~~
   丫的我还真没钻研精神~~
分享到:
评论
1 楼 szh_521 2014-09-28  
丫的我还真没钻研精神~~
   

相关推荐

    关于如何解决HashMap线程安全问题的介绍

    总结起来,理解HashMap的线程不安全性及其潜在问题,并根据实际需求选择合适的安全措施,是确保Java程序稳定运行的关键。无论是使用Collections.synchronizedMap()、ConcurrentHashMap还是避免在多线程环境中使用,...

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

    总结来说,`HashMap`在Java中是线程不安全的,不适用于多线程环境中的共享数据存储。在并发编程中,应使用`ConcurrentHashMap`或其他线程安全的数据结构,以确保数据的一致性和正确性。理解并正确处理这些并发问题...

    java的hashMap多线程并发情况下扩容产生的死锁问题解决.docx

    在Java的HashMap中,多线程并发环境下的扩容操作可能会引发死锁问题。这主要发生在JDK 1.7版本,因为其扩容机制采用了头插法。以下详细解释这个问题及其解决方案。 首先,HashMap的扩容机制是在容量达到阈值时触发...

    hashmap-thread-test:测试 Java HashMap 是否是线程安全的

    然而,`HashMap`并非线程安全,这意味着在多线程环境中直接使用`HashMap`可能会导致数据不一致、并发问题,甚至程序崩溃。本项目“hashmap-thread-test”显然是为了测试和展示这一特性。 ### Java HashMap 的特性 ...

    高级程序员必会的HashMap的线程安全问题,适用于0~2年的.7z

    然而,对于多线程环境,HashMap并不是线程安全的,这在并发编程中可能会引发一系列问题。本篇将深入探讨HashMap的线程安全问题,并提供相关的解决方案。 首先,我们需要了解HashMap在多线程环境下可能出现的问题: ...

    自定义map实现java的hashmap

    - 线程安全:Java中的HashMap不是线程安全的,如果在多线程环境下使用,需要考虑同步机制,如使用`Collections.synchronizedMap()`或者使用`ConcurrentHashMap`。 - 空值处理:键或值为null的情况需要特殊处理,...

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    js 版 java hashmap

    9. **并发安全**:如果在多线程环境下使用,还需要考虑线程安全问题。Java的HashMap不是线程安全的,但JavaScript环境通常是单线程的,所以这个问题在JavaScript中可能不那么突出。 综上所述,"js版java HashMap"的...

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

    ### HashMap多线程解决方案 #### 一、引言 在多线程环境下,Java的`HashMap`类在处理并发操作时容易出现线程安全问题。本文档深入探讨了`HashMap`在多线程环境中可能遇到的安全问题,并提出了一系列可行的解决方案...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    - **非线程安全**:由于它不是同步的,因此不能直接在多线程环境中使用,除非将其包装到`Collections.synchronizedMap()`中或使用`ConcurrentHashMap`。 - **存储null键和值**:`HashMap`允许一个`null`键和多个`...

    Java-HashMap.rar_hashmap_java hashmap

    1. **非同步**:`HashMap`不是线程安全的,因此在多线程环境下不建议直接使用,可以考虑使用`Collections.synchronizedMap()`方法将其包装为同步的,或者使用`ConcurrentHashMap`。 2. **无序性**:`HashMap`中的...

    Java集合多线程安全.docx

    总的来说,Java集合的线程安全问题需要开发者在设计多线程程序时给予足够的关注。合理选择线程安全的集合类,或者使用同步机制对非线程安全的集合进行封装,是确保程序正确性的关键步骤。此外,Java并发库(如`...

    Java中HashMap详解(通俗易懂).doc

    5. **线程安全性**:HashMap本身不是线程安全的,如果在多线程环境中使用,需要外部同步机制来保证数据一致性。对于线程安全的需求,可以使用ConcurrentHashMap。 HashSet是基于HashMap实现的,它不存储值,只存储...

    Java多线程程序案例

    根据给定文件的信息,我们可以提炼出以下关于Java多线程程序设计的知识点: ### Java多线程基础 在Java中,多线程是通过`Thread`类或实现`Runnable`接口来实现的。多线程可以提高程序的执行效率,尤其是在处理CPU...

    Java多线程矩阵相乘的代码

    在Java编程语言中,多线程是实现并发执行任务的关键技术。这个压缩包中的内容,"Java多线程矩阵相乘的代码",显然提供了一个示例,演示如何利用多线程来加速矩阵乘法这一计算密集型操作。矩阵相乘在科学计算、图像...

    java中HashMap详解

    HashMap不是线程安全的,多线程环境下可能会导致数据不一致。如果需要线程安全,可以使用`ConcurrentHashMap`。 10. **JDK 7与JDK 8的比较**: JDK 8对HashMap进行了优化,引入红黑树以减少长链表的查找时间,...

    Java多线程编程的线程安全性.docx

    Java标准库中有一些类,如ArrayList、HashMap和SimpleDateFormat,并未设计为线程安全,因此在多线程环境下直接使用可能导致数据不一致或其他问题。开发者应当了解每个类的线程安全特性,以便做出正确的选择和适当地...

    JAVA集合、多线程

    2. **线程同步**:为了防止多线程环境下数据的不一致,Java提供了synchronized关键字,可以保证同一时刻只有一个线程访问同步代码块。此外,还有wait()、notify()和notifyAll()方法用于线程间通信。 3. **线程池**...

    Java的线程安全与不安全集合.docx

    线程不安全则表示在多线程环境下,如果不采取额外的同步措施,就可能引发数据竞争和其他并发问题。 线程不安全集合: 1. `ArrayList`: 这是一个动态数组实现的列表,其添加、删除和修改操作不是线程安全的。在并发...

    java多线程聊天室

    Java多线程聊天室是一个基于Java编程语言实现的实时通讯应用,主要利用了Java的多线程技术来处理并发用户间的交互。在这个项目中,我们可以深入理解Java的并发编程概念,以及如何在实际应用中应用这些知识。以下将...

Global site tag (gtag.js) - Google Analytics