`
liangguanhui
  • 浏览: 112504 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

多线程HashMap的读取是否需要同步?

阅读更多
多线程HashMap的读取是否需要同步?这个问题一直困扰着我,虽然Collections提供了同步的map,但我一般都是直接使用HashMap,读的时候不同步,写的时候才同步。下面是我从HashMap里截取的读的源代码,估计读的时候应该是不用同步的。其他的Map我没有仔细看,但估计应该也是差不多。

    public Object get(Object key) {
        Object k = maskNull(key);
        int hash = hash(k);
        int i = indexFor(hash, table.length);
        Entry e = table[i]; 
        while (true) {
            if (e == null)
                return e;
            if (e.hash == hash && eq(k, e.key)) 
                return e.value;
            e = e.next;
        }
    }

    public boolean containsKey(Object key) {
        Object k = maskNull(key);
        int hash = hash(k);
        int i = indexFor(hash, table.length);
        Entry e = table[i]; 
        while (e != null) {
            if (e.hash == hash && eq(k, e.key)) 
                return true;
            e = e.next;
        }
        return false;
    }

    static Object maskNull(Object key) {
        return (key == null ? NULL_KEY : key);
    }

    static int hash(Object x) {
        int h = x.hashCode();

        h += ~(h << 9);
        h ^=  (h >>> 14);
        h +=  (h << 4);
        h ^=  (h >>> 10);
        return h;
    }

    static int indexFor(int h, int length) {
        return h & (length-1);
    }

    static boolean eq(Object x, Object y) {
        return x == y || x.equals(y);
    }
分享到:
评论
1 楼 baallee 2007-07-20  
HashMap是不提供同步机制的。
建议使用ConcurrentHashMap

相关推荐

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

    当元素数量达到容量的75%时,`HashMap`会自动进行扩容,这可能导致在多线程环境下性能下降,因为扩容操作需要重新计算所有元素的散列位置。 ### 多线程下的问题 - **数据不一致**:由于多个线程可能同时修改`...

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

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

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

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

    java断点续传,刚刚整理出来多线程处理

    然而,实现多线程断点续传需要解决几个问题: 1. **同步管理**:多个线程可能会同时访问同一个文件的部分,因此需要使用`synchronized`关键字或`Lock`对象来确保并发安全。 2. **断点信息共享**:每个线程需要知道...

    深入Java多线程和并发编程

    为了满足这些需求,开发者需要利用多线程与并发编程来提高程序的响应速度和吞吐能力。通过合理地分配和管理线程资源,可以显著提升应用程序的性能表现。 #### 多任务处理基础 - **操作系统任务调度**:操作系统是...

    HashMap CRUD操作

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

    HashMap二级词典

    如果在多线程环境中使用,需要使用`Collections.synchronizedMap()`方法进行同步处理,或者使用`ConcurrentHashMap`。 2. **哈希冲突**:`HashMap`通过哈希函数计算键的哈希值,以确定存储位置。若两个键的哈希值...

    java的一些图片,网络编程,多线程,数据结构

    线程同步是多线程编程中的关键问题,Java提供了`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法以及`java.util.concurrent`包中的高级并发工具,如Semaphore、CountDownLatch、CyclicBarrier等,来...

    封装读取配置文件

    在读取配置文件的方法中,使用了`synchronized`关键字,确保多线程环境下对`HashMap`的操作是线程安全的。这是因为配置文件的读取可能会在多线程环境中发生,如果不加控制,可能会导致数据不一致或者读取失败。 ###...

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

    Java程序中的多线程技术是实现并发操作的关键,尤其在处理并发读写数据时,如在本例中,我们有两条线程分别负责读取和写入学生的成绩数据。这样的设计可以提高程序的效率,同时需要确保数据的一致性和安全性。 首先...

    java多线程编程实践

    ### Java多线程编程实践 #### 一、`concurrent`包提供的集合 在Java中,`java.util.concurrent`包提供了许多高级并发工具类和容器,这些类在多线程环境中能够有效地提升程序的性能与可靠性。下面详细介绍该包中的...

    多线程集合及IO面试

    ### 多线程集合及IO面试知识点概览 #### 逻辑思考题解析 1. **果冻颜色问题**: - 这是一个经典的抽屉原理(鸽巢原理)的应用问题。根据题意,桶里有黄色、绿色和红色三种颜色的果冻。如果随机抓取果冻,为了确保...

    Java面试题20道题常见

    多线程有多种实现方式,如继承 Thread 类、实现 Runnable 接口、使用 ExectuorService、Future、Callable 实现由返回值的线程等。同步和并发可以通过同步方法、同步代码块、锁等方式解决。 守护线程是指为其他线程...

    你所不知道的五件事情(并发多线程编程).doc

    并发多线程编程是软件开发中的一个重要领域,尤其是在Java中,由于其强大的并发库,能够有效地处理多线程环境下的复杂任务。以下是你所不知道的关于并发多线程编程的五件事情: 1. **TimeUnit**: `TimeUnit` 类在 `...

    多线程并发集合资料.zip

    在Java编程中,多线程并发集合是程序员在开发高并发应用时必须掌握的重要概念。这些集合类的设计目的是为了在多线程环境下提供高效、安全的数据共享,避免数据竞争和死锁等问题。以下是对给定文件中涉及知识点的详细...

    林敏锐-词频统计.zip

    6. **并发与同步**:在多线程环境下,数据共享可能导致竞态条件,因此需要使用适当的同步机制,如`synchronized`关键字或`java.util.concurrent`包中的工具类,以确保数据的一致性和正确性。 7. **结果排序**:统计...

    Android入门:多线程断点下载详细介绍

    四、注意事项四、注意事项在实现多线程断点下载时,需要注意以下几点: 1. 同步问题:多个线程同时写入数据库可能会引发冲突,需要使用合适的同步机制保证数据一致性。 2. 错误处理:处理网络异常、文件写入异常等...

    android多任务多线程断点下载[文].pdf

    在Android开发中,多任务多线程断点下载是一项重要的技术,它允许用户在任何时间点暂停下载,然后在稍后的时间继续从停止的地方开始,而不需要重新下载已有的部分。这种技术通常用于处理大文件的下载,如应用程序、...

    Java中HashMap和Hashtable的区别浅析

    总的来说,HashMap适合于单线程环境或需要高并发读取且可以自行管理同步的场景,而Hashtable则适用于需要保证线程安全且不需要高性能读写操作的多线程环境。在选择使用哪个类时,开发者应根据具体的应用需求和性能...

    最新java面试题及答案

    10. 多线程的实现、同步和并发是如何解决的? 答案是,多线程的实现有多种方式,如继承Thread类、实现Runnable接口、使用ExecutorService、Future、Callable实现由返回值的线程。同步和并发可以通过同步方法、同步...

Global site tag (gtag.js) - Google Analytics