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

ConcurrentHashMap的put方法

计算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变成

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

    PUT和POST的区别

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

    2.1K10

    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,表明原子更新操作完毕。...利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。...在理想情况下,链表长度符合泊松分布,各个长度的命中概率依次递减,当长度为 8 的时候,概率仅为 0.00000006,小于千万分之一的概率,通常我们的 Map 里面是不会存储这么多的数据的,所以通常情况下

    75210

    解析HashMap中的put方法

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

    71510

    简单的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.3K20
    领券