首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ConcurrentHashMapput方法

计算key哈希值for自旋保证put成功如果没有初始化就初始化table有可能多个线程去调用initTable()方法去初始化,用cas加锁就行了,成功一次就行了通过与哈希取模计算数组下标,如果下标节点为...null,就通过cas放进数组当前下标的位置如果当前下标有值,并且发现当前节点正在做扩容迁移操作,就去帮助扩容如果既有值,又没在扩容,就锁住这个数组下标节点,开始进行put操作第一种情况当前节点是一个链表遍历整个链表判断...hash相同,并且key也相同,则覆盖如果hash不存在,此时已经遍历到了最后一个节点e,然后把当前key/value添加到链表e节点后i面,尾插法第二种情况当前节点是红黑树将节点放入红黑树,具体怎么放参考我另一篇同系列下文章之红黑树...put进去之后,会对链表长度进行判断,如果链表长度大于等于8,进行扩容或者转化为红黑树链表扩容如果tab长度小于64,则调用tryPresize()方法进行扩容链表扩容本质是16->32,将数组扩容一倍...,然后将老数组数据迁移到新数组如果为空就初始化数组,跟之前initTable()方法一样如果已经是最大容量了,直接返回判断sizeCtl是否小于0,因为只有在扩容中时候sizeCtl才会小于0变成

72510
您找到你想要的搜索结果了吗?
是的
没有找到

PUT和POST区别

PUT 和 POST 是 HTTP 协议中两种常用请求方法。它们有些相似之处,但也有一些重要区别。在本文中,我们将详细介绍 PUT 和 POST 区别。...PUT 请求 PUT 请求是 HTTP 协议中一种请求方法,通常用于更新或替换服务器上资源。使用 PUT 请求时,客户端需要将整个资源新版本发送到服务器。...如果服务器上不存在该资源,则会创建一个新资源。 PUT 请求具有幂等性,即执行多次 PUT 请求结果应该相同。...幂等性不同:PUT 请求具有幂等性,即执行多次 PUT 请求结果应该相同,而 POST 请求不具有幂等性。...总之,PUT 和 POST 请求有些相似之处,但也有一些其他区别: 安全性不同:PUT 请求是安全,即对服务器上资源任何操作都不会导致状态改变。

95810

ConcurrentHashMap#Put

put public V put(K key, V value) { return putVal(key, value, false); } /** Implementation...for put and putIfAbsent */ final V putVal(K key, V value, boolean onlyIfAbsent) { if (key...,用于确定待操作对象在内存中具体位置,然后取出值和第三个参数进行比较,如果相等,则将内存中值更新为第四个参数值,同时返回true,表明原子更新操作完毕。...利用CPUCAS指令,同时借助JNI来完成Java非阻塞算法。其它原子操作都是利用类似的特性完成。...在理想情况下,链表长度符合泊松分布,各个长度命中概率依次递减,当长度为 8 时候,概率仅为 0.00000006,小于千万分之一概率,通常我们 Map 里面是不会存储这么多数据,所以通常情况下

73310

解析HashMap中put方法

引言 在Java集合中,HashMap重要性不言而喻,作为一种存储键值对数据结构,它在日常开发中有着非常多应用场景,也是面试中高频考点,本篇文章就来分析一下HashMap集合中put方法。...put方法执行流程 我们直接通过一个程序来理解HashMap中put方法执行流程,在put方法中,HashMap需要经历初始化、存值、扩容、解决冲突等等操作: public static void...} put方法又调用了putVal方法,并传入了keyhash,key,value等等参数,所以先来计算keyhash: static final int hash(Object key) {...所以,HashMap在第一次调用put方法时会创建一个总容量为16Node类型数组(前提是调用无参构造方法),但实际上只有12容量可以被使用,当第13个元素插入时,就需要考虑扩容。...会进行扩容,扩容至原容量2倍 HashMapput方法执行流程:首先判断当前table是否为空,若为空,则初始化,若不为空,则根据keyhash计算得到插入位置,再判断该位置是否有元素,若无元素,

67410

简单redis缓存操作(get、put

简单redis缓存操作(get、put) 本文介绍简单redis缓存操作,包括引入jedisjar包、配置redis、RedisDao需要一些工具、向redis中放数据(put)、从redis中取数据...1)从redis中取出数据是序列化,我们需要使用protostuff反序列化操作,将序列化对象转化成我们需要对象 2)向redis中放入数据时,我们需要先使用protostuff序列化操作,...路径是我包路径,注意你在配置时候应使用你自己路径 2)这里使用本地redis服务localhost 3)redis服务默认端口是6379 三、RedisDao需要一些工具   //redis...你要使用什么对象,你就在Object位置写入你对象(Object.class:获取对象字节码文件) 3)连接池JedisPool初始化需要两个参数:ip、port 四、向redis中放数据(put...//如果仍然没有 return null //那么返回空 else //否则 put

1.2K20
领券