![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaEE
lts223
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap 做过什么改进?HashMap 死锁
但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);),当线程占用一个Segment时,其他线程可以访问其他段的数据.(每个segment都是一个锁).与hashtable相比,这么设计的目的是对于put,remove等操作,可以减少并发冲突,对不属于同一个片段的节点可以并发操作,大大提高了性能;...原创 2022-07-22 09:19:37 · 302 阅读 · 1 评论 -
HashMap push方法的执行过程
hash冲突就是不同的key有相同的hash值,这时就会出现hash冲突,当发生冲突后,冲突的数据会存在这个Entry对应的链表上(即Hash冲突后,那么HashMap的单个bucket里存储的不是一个Entry,而是一个Entry链),冲突后会将元素插入在链表的开头。遍历过程中若发现key已经存在直接覆盖value即可;②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;...原创 2022-07-22 09:18:58 · 511 阅读 · 0 评论 -
spring里面的3层缓存解决Bean的相互引用
spring解决循环依赖也是如此,首先暴露一个未初始化的实例TestA放到缓存中,创建TestB的实例时,获取的是TestA的未初始化对象,TestB创建完成以后,将TestA进行初始化,由于TestB中TestA的引用和TestA是一样的,TestB中的属性也是完全的初始化的。有一个值得注意的地方时,在创建普通bean(没有代理)的时候,二三级缓存其实没区别,这个匿名内部类ObjectFactory就是三级缓存中的值,用于获取被代理后的bean,没有进行代理时,二级缓存与三级缓存就是一样的。...原创 2022-07-22 09:11:17 · 386 阅读 · 0 评论 -
finalize方法
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动该对象被回收的时候被调用。使用finalize还需要注意一个事,调用super.finalize(),一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。...原创 2022-07-22 09:10:43 · 397 阅读 · 0 评论 -
jvm是如何回收堆内存里面对象之间的相互引用的
可达性分析法中不可达的对象,被真正回收之前,要进行2次标记的过程,可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize方法,或finalize方法已经被虚拟机调用过,虚拟机将这两种情况视为没有必要执行。(1)引用计数法,即给对象添加一个引用计数器,有地方引用,则计数器+1,当引用失效,则计数器减1,任何时候计数器为0的对象就不可能再被使用了,这个方法简单高效,但是无法解决对象之间相互循环引用的问题;只具有弱引用的对象拥有更短暂的生命周期。...原创 2022-07-22 09:09:57 · 341 阅读 · 0 评论