hash

ConcurrentHashMap 源码浅析 1.7

落花浮王杯 提交于 2020-03-23 15:38:18
简介 (1) 背景 HashMap死循环:HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry. HashTable效率低下:HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一个线程访问HashTable的同步方法,其它线程也访问HashTable的同步方法时,会进入阻塞或轮询状态.如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法获取元素,所以竞争越激烈效率越低. (2) 简介 HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么多线程访问容器里不同的数据段时,线程间不会存在竞争,从而可以有效提高并发访问效率,这就是ConcurrentHash所使用的锁分段技术.首先将数据分成一段一段地储存,然后给每一段配一把锁,当一个线程占用锁访问其中一段数据时,其它段的数据也能被其它线程访问. 结构 ConcurrentHashMap是由Segments数组结构和HashEntry数组结构组成

ConcurrentHashMap源码解析

假如想象 提交于 2020-03-23 15:34:29
ConcurrentHashMap源码解析 [TOC] jdk8之前的实现原理 jdk8的实现原理 JDK8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全,底层依然采用数组+链表+红黑树的存储结构。 变量解释 table:默认为null,初始化发生在第一次插入操作,默认大小为16的数组,用来存储Node节点数据,扩容时大小总是2的幂次方。 nextTable:默认为null,扩容时新生成的数组,其大小为原数组的两倍。 sizeCtl :默认为0,用来控制table的初始化和扩容操作,具体应用在后续会体现出来。 -1 代表table正在初始化 -N 表示有N-1个线程正在进行扩容操作 其余情况: 1、如果table未初始化,表示table需要初始化的大小。 2、如果table初始化完成,表示table的容量,默认是table大小的0.75倍,居然用这个公式算0.75(n - (n >>> 2))。 Node:保存key,value及key的hash值的数据结构。 ForwardingNode:一个特殊的Node节点,hash值为-1,其中存储nextTable的引用。只有table发生扩容的时候,ForwardingNode才会发挥作用,作为一个占位符放在table中表示当前节点为null或则已经被移动。 初始化

redis命令大全参考手册

纵饮孤独 提交于 2020-03-23 14:43:01
redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令,并附有解释说明,大家可以收藏、参考,你一定要知道的是:redis的key名要区分大小写,在redis中除了 和空格外,其他的字符都可以做为key名,且长度不做限制,不过为了性能考虑,一般key名不要设置的太长(本文转自网络仅供本人学习之用) 一个redis命令很不错的网站 http://www.daixiaorui.com/manual/redis-setex.html 一:redis命令基本篇 1.【 set key value 】 存入一个key和值。如:set myname reson 2.【 get key 】 读取一个key的值。 3.【 del key 】 删除一个key。 4.【 del key1 key2 ... keyN 】 删除多个key。如:del myname1 myname2 5.【 exists key 】 判断一个key是否存在。 6.【 type key 】 查看key的类型。 7.【 rename key keyNew 】 重命名key名。如:rename myname myname2 8.【 dbsize 】 查看当前库中的key的条数。 9.【 expire key time 】 指定key的过期时间,单位为秒。如:expire myname

SOLVED: Hash content access is inconsistent with different perl version

喜你入骨 提交于 2020-03-23 08:19:47
问题 I came across an interesting problem with following piece of code in perl 5.22.1 and perl 5.30.0 use strict; use warnings; use feature 'say'; #use Data::Dumper; my %hash; my %seen; my @header = split ',', <DATA>; chomp @header; while(<DATA>) { next if /^\s*$/; chomp; my %data; @data{@header} = split ','; push @{$hash{person}}, \%data; push @{$hash{Position}{$data{Position}}}, "$data{First} $data{Last}"; if( ! $seen{$data{Position}} ) { $seen{$data{Position}} = 1; push @{$hash{Role}}, $data

hash in JS == hash in PHP

橙三吉。 提交于 2020-03-23 07:00:01
问题 I need to make a hash with JS and PHP but I need them to both work out to be the same hash. I am just wondering what the best idea would be to go about it. it needs to be secure, but its not hashing sensitive data so doesn't need a huge amount of security around it. could anyone give me some examples Thank you. 回答1: You could use MD5: the php and the JS solution should work out to be the same given the same string input. http://pajhome.org.uk/crypt/md5/ has a list of hash implementations in

HashMap中 get(K key) 和 put(K key,V value) 的具体过程

…衆ロ難τιáo~ 提交于 2020-03-22 18:08:21
说在前面 本文包含手写泛型HashMap<K,V>为简化版,仅为理解 HashMap 的 get() 和put() 方法的工作过程,非Java源码。 get(K key) 原理 先计算出key对应的hash值 int hash = key.hashCode(); //此处的 hashCode() 方法为 Object对象 所属方法,默认都有 //自定义的类需要覆写该方法 对超出数组范围的hash值进行处理 hash = (hash >>> 16)^hash;//java内部自做的优化,为了使hash值更加均衡,减少冲突 int index = hash & (table.length - 1);//对下标进行合理化,以免下标越界 //这样做可以使index在数组长度范围内的原因或者一个前提是,这里的数组的长度一定是2的n次方, //这样table.length - 1 在二进制情况下,除最高位,其余低位为一定是1,用hash与这样的一个数进行与操作 //即只保留了hash的二进制的低位,就会使hash的范围一定小于数组长度 根据正确的hash值(下标值)找到所在的链表的头结点 Entry<K,V> node = table[index]; 遍历链表,如果key值相等,返回对应的value值,否则返回null while(node != null){ if(node.key

马哥博客作业第一周

会有一股神秘感。 提交于 2020-03-22 16:01:29
------------恢复内容开始------------ 一 、 Linux系统 计算机系统的组成部分: .冯*诺依曼体系结构 冯诺依曼体系的 要点: 1. 数字计算机的数制采用二进制,bit 位, byte 字节 1 byte =8 bit 2. 计算机应该按照程序顺序执行 3. 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成 内存宽带计算公式 内存带宽=内存总线频率×数据总线位数/8 Linux的哲学思想: 1.一切都是一个文件(包括硬件) 2.小型单一用途的程序 3.链接程序,共同完成复杂的任务 4.避免令人困惑的复杂界面 5.配置数据储存在文本中。 二 、Linux基础入门 用户 root用户:一个特殊的管理用户,也被称为超级用户, root已接近完整的系统控制,对系统的损害几乎无限的能力,除非必要,不要登录。 普通用户:权限有限,造成的伤害有限。 终端类型 控制台终端: /dev/console 串行终端: /dev/ttyS# 虚拟终端: tty:teletypewriters, /dev/tty#,tty 可有n个,Ctrl+Alt+F# 图形终端: startx, xwindows CentOS 6: Ctrl + Alt + F7 CentOS 7: 在哪个终端启动,即位于哪个虚拟终端 伪终端: pty:pseudo-tty , /dev

java集合类分析-hashmap

为君一笑 提交于 2020-03-22 08:13:11
一、HashMap概述 二、HashMap的数据结构 三、HashMap源码分析 1、关键属性 2、构造方法 3、存储数据 4、调整大小 5、数据读取 6、HashMap的性能参数 一、HashMap概述   HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。   值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。 Map map = Collections.synchronizedMap(new HashMap()); 二、HashMap的数据结构   HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道

分布式redis

末鹿安然 提交于 2020-03-21 04:44:07
一. 水平拆分 sharding 1. 解决数据量和访问量增加后对单节点造成的性能压力;水平拆分后的每个节点存储和处理的数据原则上没有交集; 2. 数据分布: hash映射:将不可控的业务值域key均匀映射到可控的有限值域(hash值)上,再将均匀分布的hash值枚举的映射到redis实例上; 范围映射:选择key本身而不是key的某个运算值作为数据分布的条件,且每个数据节点存放的key的值域是连续的; hash和范围映射:典型的方式是一致性hash,首先对key进行hash运算,得到值域有限的hash值,再对hash值做范围映射; 3. 请求路由 只读的跨实例请求需要将请求中的多个key分别分发到对应实例上执行,再合并结果; 跨实例的原子读写请求中,实例B的写入操作依赖于实例A的读取,没有单线程特性保证并发安全,因此原子请求是不支持的; 二. 主备复制 replication 1. 当某个节点宕机时,其上的数据在其他节点上有副本;同一份数据在多个节点上存储,可以分离读取和写入操作; 2. 主备复制流程 redis包含master和slave两种节点,master提供读写服务,slave作为master的数据备份拥有master的全量数据,不提供写服务; slave启动后触发SYNC命令,master被动的讲新进slave节点加入主备复制集群;

Java爬取并下载酷狗音乐

北慕城南 提交于 2020-03-20 22:02:49
本文方法及代码仅供学习,仅供学习。 案例:   下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup、HttpClient、fastJson等。 正文:   1、分析是否可以获取到TOP500歌单 打开酷狗首页,查看TOP500,发现存在分页,每页显示22条歌曲, 发现酷狗的链接如下: https://www.kugou.com/yy/rank/home/1-8888.html?from=homepage 通过更改链接中的1可以进行分页,所以我们可以通过更改链接地址获取其余的歌曲。 2、分析找到正真的mp3下载地址 点一个歌曲进入播放页面,使用谷歌浏览器的控制台的Elements,搜一下mp3,很轻松就定位到了MP3的位置。 但是使用java访问的时候爬取的html里却没有该mp3的文件地址,那么这肯定是在该页面的位置使用了js来加载mp3,那么刷新下网页,看网页加载了哪些东西,加载的东西有点多,着重看一下js、php的请求,主要是看里面有没有mp3的地址。 最终在列表中找到: https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery191044492686523157987_1559446927765&hash=458E9B9F362277AC37E9EEF1CB80B535&album_id