0 0

请教一个ConcurrentHashMap的问题5

一个线程向一个新创建的ConcurrentHashMap中添加一个k-v对。
完毕后,另一个线程通过k从ConcurrentHashMap中获取v。

ConcurrentHashMap是如何保证前一个线程添加的元素对后面的线程是可见的。
根据资料显示volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素。
套用happens-before法则,仍然无法得出结论。

transient volatile HashEntry<K,V>[] table;


       V put(K key, int hash, V value, boolean onlyIfAbsent) {
            lock();
            try {
                int c = count;
                if (c++ > threshold) // ensure capacity
                    rehash();
                HashEntry<K,V>[] tab = table;
                int index = hash & (tab.length - 1);
                HashEntry<K,V> first = tab[index];
                HashEntry<K,V> e = first;
                while (e != null && (e.hash != hash || !key.equals(e.key)))
                    e = e.next;

                V oldValue;
                if (e != null) {
                    oldValue = e.value;
                    if (!onlyIfAbsent)
                        e.value = value;
                }
                else {
                    oldValue = null;
                    ++modCount;
                    [b]tab[index] = new HashEntry<K,V>(key, hash, first, value);[/b]
                    count = c; // write-volatile
                }
                return oldValue;
            } finally {
                unlock();
            }
        }


        V get(Object key, int hash) {
            if (count != 0) { // read-volatile
                [b]HashEntry<K,V> e = getFirst(hash);[/b]
                //在未充分同步的情况下,此处不能是null么?
                while (e != null) {
                    if (e.hash == hash && key.equals(e.key)) {
                        V v = e.value;
                        if (v != null)
                            return v;
                        return readValueUnderLock(e); // recheck
                    }
                    e = e.next;
                }
            }
            return null;
        }
2012年12月30日 21:32

1个答案 按时间排序 按投票排序

0 0

ConcurrentHashMap最精华的部分在于它的Segment,ConcurrentHashMap通过Segment的分块化对出现竞争部分的data进行锁定,从而提高了操作的效率。具体的说明,我推荐这个文章,这位哥们写得非常好。请借鉴之!
http://www.infoq.com/cn/articles/ConcurrentHashMap

2012年12月30日 22:14

相关推荐

    java源码剖析-ConcurrentHashMap

    `ConcurrentHashMap`是Java并发包(`java.util.concurrent`)中的一个重要组成部分,它提供了一个线程安全的哈希表实现。与传统的`Hashtable`相比,`ConcurrentHashMap`具有更高的并发性能,这主要得益于它的分段锁...

    ConcurrentHashMap源码剖析

    `ConcurrentHashMap`内部维护了一个`Segment`数组,每个`Segment`对象都是一个小型的`HashTable`。数组的长度通常是2的幂次方,以便于通过位运算快速定位到对应的`Segment`。 **2. HashEntry** `HashEntry`类表示...

    java本地缓存ConcurrentHashMap

    java本地缓存ConcurrentHashMap

    ConcurrentHashMap源码解析

    在Java并发编程中,ConcurrentHashMap是一个重要的并发集合。它是由Doug Lea在JSR166y中引入,并在Java 5中提供的一种线程安全的HashMap实现。与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug.docx

    在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug问题

    这是因为ConcurrentHashMap使用的是链表存储结构,当两个键的哈希值相同时,ConcurrentHashMap将会将这两个键存储在同一个链表中,从而导致死循环的问题。 这个问题的解决方案是使用JDK1.8中ConcurrentHashMap的另...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    ConcurrentHashMap的实现原理

    其中,Segment 分段锁是 ConcurrentHashMap 中的核心组件,它继承自 ReentrantLock,内部拥有一个 Entry 数组,数组中的每个元素又是一个链表。这种结构使得 ConcurrentHashMap能够实现真正的并发访问。 ...

    ConcurrentHashmap源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    ConcurrentHashMap之实现细节

    - **分段(Segment)的概念**:`ConcurrentHashMap`内部将散列表划分为多个段,每个段都是一个小的散列表,并且拥有自己的锁。这样,当不同的线程试图修改不同段时,它们可以同时进行而不会相互阻塞。例如,假设散...

    高薪程序员面试题精讲系列49之说说ConcurrentHashMap#put方法的源码及数。。。.pdf,这是一份不错的文件

    ConcurrentHashMap是Java并发编程中的一个重要组件,用于解决高并发情况下的数据存储问题。在面试中,ConcurrentHashMap的底层原理、put方法的实现细节都是高频考点。本文将对ConcurrentHashMap#put方法的源码进行...

    ConcurrentHashMap的实现原理(JDK1.7和JDK1.8).pdf

    `ConcurrentHashMap`是Java并发编程中非常重要的一个数据结构,它是线程安全的HashMap实现。在理解`ConcurrentHashMap`的实现原理之前,我们先来看看哈希表的基本概念。 哈希表是一种键值对存储的数据结构,通过键...

    ConcurrentHashMap思维导图完整版

    ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    在Java 7中,`HashMap`内部由数组和链表构成,当多个键映射到同一个哈希桶时,会形成链表。如果链表过长,查询效率会降低,此时Java 8引入了红黑树优化,当链表长度达到8时,会转换为红黑树,进一步提高查找效率。 ...

    71-ConcurrentHashMap笔记1

    而JDK1.8之前的ConcurrentHashMap则引入了Segment分段锁,每个Segment相当于一个小的HashMap,这样可以在一定程度上提高并发性,但仍然存在锁粒度过粗的问题。 JDK1.8的ConcurrentHashMap改进了这一设计,它不再...

    java集合-ConcurrentHashMap的使用

    ConcurrentHashMap使用了分段锁(Segment)来实现并发的读写操作,每个Segment都相当于一个小的HashMap,将整个哈希表分成多个部分。这样可以同时进行多个线程的并发读写操作,不会阻塞其他线程的访问。 需要注意的...

Global site tag (gtag.js) - Google Analytics