Java ConcurrentHashMap 的理解

HashMap是不安全的类,Java5.0前是使用了同步锁将HashMap给封装起来,但有个缺点,这样将把所有的访问都串行化,这样会严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。

ConcurrentHashMap并不是将每个方法都在同一个锁上同步,而是使用一种粒度更细的加锁进制来实现更大程度的共享,这种机制称为分段锁。

从Concurrent的源码中可以看出,读取操作是没有加锁的。

接下来看Map中node的值,可以从下图源码中看出有四个值,

hash,key, val, next,其中key, hash是不可变的,一经初始化,就不可修改,这样可以防止被破坏表的结构,那ConcurrentHashMap是如何保证写正常的了,这就是用到了分段锁。

可以从源码中看出,是先读取出所在的Segment,再对Segment加锁,从而实现分段访问。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 05:12:51

Java ConcurrentHashMap 的理解的相关文章

java常量池理解

String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang"); //第二种创建方式 第一种创建方式是编译期在常量池中创建对象,如果常量池中已经存在"zheng"这个String对象,就将地址赋给s1.第二种创建方式是运行期在堆中创建对象,无论堆中是否已有都会重新创建一个对象. String s1 = new String("xyz&q

有关JAVA多线程的理解

不同于c++等语言的调用操作系统的线程调控机制来实现多线程,java语言内置了多线程的api包,因此可以更加方便的使用多线程技术.(1)线程的问题.进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程.线程是比进程更小的单位,一个进程执行过程中可以产生多个线程,每个线程有自身的产生.存在和消亡的过程,也是一个动态的概念.每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现

Java ConcurrentHashMap Example and Iterator--转

原文地址:http://www.journaldev.com/122/java-concurrenthashmap-example-iterator#comment-27448 Today we will look into Java ConcurrentHashMap Example. If you are a Java Developer, I am sure that you must be aware of ConcurrentModificationException that com

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

【Java】深入理解ThreadLocal

一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包含多个线程的时候,就需要考虑线程安全问题,因为此时线程可能会同时操作同一个资源,当两个或者两个以上线程同时操作一个资源的时候,就会造成冲突.不一致等问题,即线程不安全. 解决线程安全问题,本质上就是解决资源共享问题,一般有以下手段: 1)可重入(不依赖环境):2)互斥(同一时间段只允许一个线程使用)

Java基础之理解Annotation(与@有关,即是注释)

Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中.

Java的finally理解

1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 如果count为要使用到的资源,而且用完要求释放此资源.那么我们能够把释放资源的语句放到try-catch后运行,当前的程序无论是在运行完try语句块还是catch语句块,都会顺序运行到以下释放资源的语句. int count = 0;  //初始化资源 try{ count++; if(count == 1) throw new Exception("Exception in try"); }

lombok 简化java代码注解 理解

lombok 注解: lombok 提供的注解不多,可以参考官方视频的讲解和官方文档.     Lombok 注解在线帮助文档:http://projectlombok.org/features/index.    下面介绍几个我常用的 lombok 注解:         @Data   :注解在类上:提供类所有属性的 getting 和 setting 方法,此外还提供了equals.canEqual.hashCode.toString 方法         @Setter:注解在属性上:为

对java泛型的理解

自jdk1.6之后泛型就被广泛使用了,刚开始也是这么稀里糊涂的学了但是老是搞不懂其中的奥妙,后来随着项目经验的增多慢慢的才体会到了泛型的各种好处,看了不少项目封装的底层才发现原来泛型一般和接口混合使用来满足标准制定和参数多样化这样的代码需求.弄清楚之后我自己也动手实际体验了一下,觉得还是挺简单的.接下来就分享下我学泛型的心得,写的不好大家可以指出来. 1 标识接口 虽然叫标识接口但是这个java类不仅仅局限于interface,class也是OK的,选择接口还是类关键看自己的选择:下面是我定义的