`
roomy
  • 浏览: 52507 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ConcurrentHashMap分析及使用

    博客分类:
  • J2SE
 
阅读更多
/**
 * ConcurrentHashMapAnalyze.java
 */
package com.xxx.common.concurrent;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ConcurrentHashMap 结构分析和使用
 */
public class ConcurrentHashMapAnalyze {
	
	// 多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%.
	// Hashtable使用synchronized来保证线程安全,在线程竞争激烈的情况下效率非常低.
	// 基于以上两个原因,ConcurrentHashMap闪亮登场.
	
	// 锁分段技术、Segment(锁角色)数组和HashEntry(存储键值)数组结构.
	// 一个ConcurrentHashMap包含一个Segment数组,一个Segment里包含一个HashEntry数组.
	// 每个HashEntry是一个链表结构的元素.
	
	/**
	 * Application entry point.
	 */
	public static void main(String[] args) {
		// 默认初始化大小为16(即Segment数组的长度为16,即有16把分段锁)
		Map<String, String> concurrentHashMap = new ConcurrentHashMap<String, String>();
		
		for (int i = 0; i < 20; i++) {
			// 通过对元素hashCode进行再哈希定位到Segment
			// 目的是为了减少哈希冲突,使元素均匀分布在不同的Segment
			// 定位到相应的Segment后加锁,判断扩容及扩容.
			concurrentHashMap.put("I" + i, "I" + i);
		}
		
		for (String key : concurrentHashMap.keySet()) {
			// Get操作简单高效,先经过一次再哈希,然后使用这个哈希值通过哈希运算
			// 定位到Segment,再通过哈希算法定位到元素,过程不需要加锁.
			String ts = concurrentHashMap.get(key);
			System.out.println(ts);
		}
		
		// 先通过两次不锁定Segment累加大小,如果统计过程中计数有变化再加锁统计.
		System.out.println(concurrentHashMap.size());
		
	}

}

 

分享到:
评论

相关推荐

    ConcurrentHashMap源码分析源码分析

    ConcurrentHashMap源码分析源码分析 代码解释非常详细!!!!

    ConcurrentHashmap源码

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

    Java并发系列之ConcurrentHashMap源码分析

    Java并发系列之ConcurrentHashMap源码分析 ConcurrentHashMap是Java中一个高性能的哈希表实现,它解决了HashTable的同步问题,允许多线程同时操作哈希表,从而提高性能。 1. ConcurrentHashMap的成员变量: ...

    程序员面试加薪必备:ConcurrentHashMap底层原理与源码分析深入详解

    程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解

    ConcurrentHashMap底层实现机制的分析1

    ConcurrentHashMap 底层实现机制分析 在本文中,我们将深入探索 ConcurrentHashMap 的高并发实现机制,并分析其在 Java 内存模型基础上的实现原理。了解 ConcurrentHashMap 的实现机制有助于我们更好地理解 Java ...

    ConcurrentHashMap源码解析

    通过以上分析,我们可以看到ConcurrentHashMap如何通过锁分段技术来解决HashMap在并发环境下的线程安全问题,并通过巧妙的设计减少线程间锁的竞争,从而提升性能。因此,在设计需要高并发性能的程序时,...

    第二章 ConcurrentHashMap源码分析(JDK8版本)1

    - 为了提高并发性能,`ConcurrentHashMap`使用了CAS操作来避免锁的使用,降低了锁竞争。此外,通过非阻塞的查找和更新策略,使得并发性能大大提升。 总的来说,JDK8版本的`ConcurrentHashMap`通过更细粒度的锁和...

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

    我们首先来理解`computeIfAbsent`方法的基本概念,然后再深入分析这个问题的成因及解决方案。 `computeIfAbsent`是JDK 1.8中新增的一个功能强大的方法,它的作用是在给定的键不存在于映射中时,通过提供的函数来...

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

    本文将对ConcurrentHashMap#put方法的源码进行详细分析,从而帮助读者更好地理解ConcurrentHashMap的工作机理。 一、ConcurrentHashMap的底层原理 ConcurrentHashMap是基于哈希表实现的,可以存储大量的数据。其...

    ConcurrentHashMap思维导图完整版

    在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、...

    ConcurrentHashMap之实现细节

    通过以上分析可以看出,`ConcurrentHashMap`的设计非常巧妙,它利用锁分离技术和不可变性来实现高效的并发访问。这种设计不仅提高了多线程环境下的性能,同时也保持了良好的线程安全性。对于需要在多线程环境下高效...

    ConcurrentHashMap共18页.pdf.zip

    综上所述,"ConcurrentHashMap共18页.pdf.zip"这份文档很可能是深入分析 ConcurrentHashMap 的详细指南,涵盖了其设计原理、实现机制以及最佳实践。如果你对并发编程或者Java集合框架有深入需求,这份资料将是一份...

    concurrenthashmap1.7.docx

    本文主要分析`ConcurrentHashMap 1.7`的`put`方法及其涉及到的关键技术。 首先,`put`方法的执行流程要求`key`不能为`null`,否则会抛出`NullPointerException`。根据`key`的哈希值计算出`segments`数组的对应下标`...

    24 经典并发容器,多线程面试必备。—深入解析ConcurrentHashMap.pdf

    【源码分析】深入理解`ConcurrentHashMap`的工作原理,需要查看其源码,特别是`put`、`get`、`resize`等关键操作,以及在不同版本中的变化,例如Java 8引入的红黑树优化。 总结,`ConcurrentHashMap`是Java并发编程...

    JDK1.7ConcurrentHashMap.md

    对JDK1.7中ConcurrentHashMap容器初始化、添加安全、扩容安全、获取集合长度这些方法进行了详细的分析

    Java源码解析ConcurrentHashMap的初始化

    因此,ConcurrentHashMap的初始化过程中使用了自旋锁来实现多线程间的同步,这样可以提高效率和避免死循环。 在学习ConcurrentHashMap的初始化过程时,我们可以学习到自旋锁的实现方式,以及它与死循环方式的不同。...

    java ConcurrentHashMap锁分段技术及原理详解

    在`ConcurrentHashMap`的源码分析中,可以看到它通过`volatile`关键字保证了`HashEntry`中`value`字段的可见性,确保了读操作的正确性,而其他字段如`key`、`hash`和`next`都是`final`的,防止在链表中进行中间插入...

Global site tag (gtag.js) - Google Analytics