`

验证Hashmap不支持同步,ConcurrentHashMap支持

    博客分类:
  • Java
阅读更多
  1. 一直都不知道concurrenthashmap有什么实际的用处?先写个例子比较下hashmap和它。
  2. 方法用2000个线程下同一个key值,同步的话,应该最后的map的size为1,不同步可以大于1.
     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class HashMapSyn {
        public static void main(String[] args) throws InterruptedException {
            System.out.println(runMapPutAndSizeShouldBe1(new HashMap<StringString>(32)));
            System.out.println(runMapPutAndSizeShouldBe1(new ConcurrentHashMap<StringString>(32)));
        }
        
        public static int runMapPutAndSizeShouldBe1(final Map<StringString> map) throws InterruptedException {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 2000; i++) {
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                map.put("1""1");
                            }
                        }, "Thread inside " + i).start();
                    }
                }
            }, "Thread outside");
            t.start();
            t.join();
            return map.size();
        }

        @Test
        public void testHashMapNotSynchronize() throws InterruptedException {
            Assert.assertEquals(1, runMapPutAndSizeShouldBe1(new ConcurrentHashMap<StringString>(32)));
            Assert.assertNotSame(1, runMapPutAndSizeShouldBe1(new HashMap<StringString>(32)));
        }
    }
  3. 当然,hashmap的最后可能测不出来,可以将hashmap拷到本来加Thread.sleep。
     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        public V put(K key, V value) {
            if (key == null)
                return putForNullKey(value);
            int hash = hash(key.hashCode());
            int i = indexFor(hash, table.length);
            for (Entry<K,V> e = table[i]; e != null; e = e.next) {
                Object k;
                if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                    V oldValue = e.value;
                    e.value = value;
                    e.recordAccess(this);
                    return oldValue;
                }
            }
            modCount++;
            
            /** add sleep for test*/
            try { Thread.sleep(1); } catch (InterruptedException e1) {}
            
            addEntry(hash, key, value, i);
            return null;
        }

     

分享到:
评论

相关推荐

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

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

    HashMap遍历

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

    阿里一面题目+答案

    - **空键值支持**:`HashMap`允许使用`null`作为键和值,而`HashTable`不允许。 - **方法差异**:`HashMap`移除了`HashTable`中的`contains`方法,改为`containsKey`和`containsValue`。 - **性能**:`HashTable`的...

    Practice-HashMap:我的java.util.HashMap实现

    为了保证线程安全,可以使用`ConcurrentHashMap`,或者在同步代码块中使用`HashMap`。 2. 容量与负载因子:`HashMap`的容量是指桶的数量,初始容量为16,负载因子默认为0.75。当元素数量达到容量与负载因子的乘积时...

    java面试精华3

    5. **MyISAM和InnoDB的区别**:MyISAM是MySQL早期的非事务型存储引擎,读取速度快,不支持行级锁定,适合读多写少的场景。InnoDB是事务型存储引擎,支持ACID特性,提供行级锁定,适合并发高、事务处理多的环境。 6....

    CD管理程序

    在多线程环境中,HashMap不是线程安全的,因此可能需要使用ConcurrentHashMap或者在访问HashMap时加入同步控制,以避免数据冲突。 在实现这些功能时,我们需要注意以下几点最佳实践: 1. 数据验证:确保输入的数据...

    java面试题及解答

    - **迭代器**:`ConcurrentHashMap`支持失败快照迭代器,即在迭代过程中可以添加或删除元素,而`HashMap`不允许这样做。 - **性能**:在高并发场景下,`ConcurrentHashMap`通常比使用`Collections.synchronizedMap()...

    java面试资料,面试题最好的面试资料

    25. **MySQL存储引擎**:如InnoDB支持事务,MyISAM不支持,还有Memory、Archive等,各有特点。 以上只是部分内容的概述,面试中可能还会涉及到其他主题,如异常处理、设计原则、数据库优化、网络编程等。深入理解...

    JAVA核心知识点整理.pdf

    Map接口的实现有HashMap、LinkedHashMap和ConcurrentHashMap等,其中HashMap在JDK7和JDK8中的实现有所不同,ConcurrentHashMap是线程安全的。 由于文档内容中有些错误,例如“servicorFrom”应该是“SurvivorFrom”...

    LRU算法--utils工具包

    `LRUCache`通常会包含一个内部类来维护一个双向链表,用于记录元素的访问顺序,同时配合哈希表(如`HashMap`或`ConcurrentHashMap`)来快速定位元素。当缓存满时,链表尾部的元素(即最近最少使用的元素)会被移除,...

    java面试题总结资料.zip

    - HashMap、HashTable、ConcurrentHashMap的工作原理 - LinkedList和ArrayList的性能比较 - 泛型的使用和限制 4. **多线程与并发**: - 线程的创建方式,同步机制(synchronized、volatile、Lock接口) - 死锁...

    java面试300讲MD答案课件

    - Map接口:HashMap、TreeMap、ConcurrentHashMap的实现原理和使用场景。 - 泛型:理解泛型的边界、通配符以及类型擦除的概念。 - CopyOnWriteArrayList和CopyOnWriteArraySet:在高并发环境下的应用。 3. **...

    很多java面试题目题目,pdf清晰版电子书。很不错

    - `HashMap` 和 `ConcurrentHashMap`:`HashMap` 非线程安全,适用于单线程环境;`ConcurrentHashMap` 是线程安全的,适合多线程环境。 - `HashSet` 和 `TreeSet`:`HashSet` 是无序且不保证元素顺序的,而 `...

    Java进阶知识点汇总.pdf

    - **`SerialVersionUID`的作用**:序列化ID用于验证序列化对象的版本一致性,如果在序列化和反序列化过程中`SerialVersionUID`不匹配,则会导致`InvalidClassException`异常。 - **影响序列化的因素**:包括对象的...

    java实际公司面试题目

    3. **集合框架**:Java集合框架包括List(ArrayList, LinkedList, Vector)、Set(HashSet, TreeSet)、Queue(LinkedList, PriorityQueue)以及Map(HashMap, TreeMap, ConcurrentHashMap)。面试中可能会要求解释...

    深入JAVA 虚拟机代码

    - 数据结构选择:根据需求选择合适的数据结构,如HashMap、TreeMap、ConcurrentHashMap等。 - 方法内联、逃逸分析等JIT优化策略。 8. **JVM调优** 使用JDK自带的JVisualVM、jconsole等工具监控JVM状态,调整堆...

    Java并发编程的艺术1

    第六章则涵盖了Java并发容器,如ArrayList、LinkedList、HashMap以及并发优化的ConcurrentHashMap等,并解析了它们的内部实现,展示了大师级的设计思路。 第七章涉及Java原子操作类,如AtomicInteger、...

    关于Java面试题小集锦

    MyISAM不支持事务,但读取速度较快,适用于读多写少的场景。 11. **TCP的四次挥手** TCP连接关闭时,需要通过四次挥手释放连接,确保双方确认无数据遗留。 12. **HTTPS** HTTPS基于SSL/TLS协议,提供加密传输和...

    java面试题,ava核心知识 集合框架、JVM机制、多线程与并发框架、网络协议、SSM框架、MySQL、分布式、微服务等

    1. **集合框架**:Java集合框架是管理对象集合的统一接口,包括List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)和Map(如HashMap、ConcurrentHashMap)。了解它们的特性和使用场景至关重要,例如...

    阿里面试题总结和答案整理

    HashMap和ConcurrentHashMap区别,ConcurrentHashMap线程安全吗,ConcurrentHashMap如何保证线程安全? - **知识点概述**:`ConcurrentHashMap`是线程安全的`HashMap`实现。 - **区别**: - `HashMap`不是线程安全...

Global site tag (gtag.js) - Google Analytics