Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by V oldValue
认真学习jdk1.7下ConcurrentHashMap的实现原理-阿里云开发者社区
HashMap无论是 1.7 还是 1.8 其实都能看出 JDK 没有对它做任何的同步操作,所以并发会出问题,甚至出现死循环导致系统不可用。这个问题就交给ConcurrentHashMap。 ConcurrentHashMap是一个 在juc包下的 map, 线程安全。 在jdk.1.8 之前采用数组+ 链表的结构 并且采用分段锁机制 来保证线程安全,而jdk1.8 改成了 数组+ 链表+ 红黑树,线程安全方面也改成了 cas+ synchronized 来保证线程安全。 ConcurrentHashMap类图如下: 本篇博文我们分析JDK1.7下ConcurrentHashMap的实现。 【1】核心属性和构造 这里可能对segmentMask、segmentShift以及segments比较疑惑,别着急我们慢慢往下看。 如下所示,从成员来讲与HashMap中的Entry类似,都是hash、key、value、next。不同的是这里value和next使用了volatile 修饰,保证其他线程能够读取到当前变量的最新值。而且其内部使用了安全类 UNSAFE来保证volatile...
Guava Cache介绍-面试用
一、Guava Cache简介 Guava Cache是本地缓存,数据读写都在一个进程内,相对于分布式缓存redis,不需要网络传输的过程,访问速度很快,同时也受到 JVM 内存的制约,无法在数据量较多的场景下使用。 基于以上特点,本地缓存的主要应用场景为以下几种: 对于访问速度有较大要求 存储的数据不经常变化 数据量不大,占用内存较小 需要访问整个集合 能够容忍数据不是实时的 二、Guava Cache使用 下面介绍如何使用 1、先引入jar <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0-jre</version> </dependency> 1、创建Cache对象,在使用中,我们只需要操作loadingCache对象就可以了。 LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder() .initialCapacity(5)...
HashMap源码分析 (基于JDK1.8)
数组 优:读取修改快 劣:增加删除慢 原因:数组可以根据下标直接定位到指定位置的数据进行读取和修改,但增加和删除需要开辟一个新数组并移动增加和删除后的数据到新数组并返回。 链表 优:增加删除快 劣:读取修改慢 原因:链表增加和删除只需断开指定位置的两端节点,但读取的时候只能从头/尾开始往另一方向读取。 拓展知识点: 数组和链表迭代的方式不同 ArrayList实现了RandomAccess接口 这是一个标记接口,标注是否可以随机访问 ArrayList使用数组实现,可以随机访问 经过测试 使用for循环遍历ArrayList更快 而LinkedList没有实现这个RandomAccess接口 不支持随机访问,使用迭代器遍历更快 RandomAccess接口的作用。 正是数组和链表各有各的优势,所以引入了散列表,结合了两者的优势尽可能的降低劣势带来的影响。 Hash 哈希:英文是Hash,也称为散列 基本原理就是把任意长度输入,转化为固定长度输出 这个映射的规则就是Hash算法,而原始数据映射的二进制串就是Hash值 Hash特点: 从Hash值不可以反向推导出原始数据...
ConcurrentHashMap为什么是线程安全的?_concurrenthashmap为什么线程安全_zhang2383906154的博客-CSDN博客
1、ConcurrentHashMap的原理和结构 我们都知道Hash表的结构是数组加链表,就是一个数组中,每一个元素都是一个链表,有时候也把会形象的把数组中的每个元素称为一个“桶”。在插入元素的时候,首先通过对传入的键(key),进行一个哈希函数的处理,来确定元素应该存放于数组中哪个一个元素的链表中。 这种数据结构在很多计算机语言中都能找到其身影,在Java中如HashMap,ConcurrentHashMap等都是这种数据结构。 但是这中数据结构在实现HashMap的时候并不是线程安全的,因为在HashMap扩容的时候,是会将原先的链表迁移至新的链表数组中,在迁移过程中多线程情况下会有造成链表的死循环情况(JDK1.7之前的头插法);还有就是在多线程插入的时候也会造成链表中数据的覆盖导致数据丢失。 所以就出现了线程安全的HashMap类似的hash表集合,典型的就是HashTable和ConcurrentHashMap.
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with V
Contact V, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack