![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jdk源码
jdk源码
韩运畅
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap的get方法是最终一致性的
证明线程1在时间点A调用get,之后线程2在一个时间点B再次调用get查询,在两个方法返回之前,调用put方法,覆盖刚才的数据考虑这样的执行序列。1. 线程2读到数据,然后时间片用完2. put成功将数据覆盖 3. 线程1读到新数据,返回4.线程2拿到时间片,返回旧数据结果就是,线程1先返回拿到新数据,而线程2后返回拿到的是一个旧数据。说明ConcurrentHashMap的注释中已经说了,get方法只能保证看到之前完成的操作,无法保证看到正在进行中的操作。针对jdk1.7的concur原创 2020-11-27 21:28:44 · 1739 阅读 · 0 评论 -
四种线程池的适用场景
很好的博文,但是我是很认可它对于cachedThreadPool的看法,我认为cachedThreadPool最大的特点应该是FixedBlockingQueue相对的,它适合每一时刻,任务数不固定的场景。当然我也赞同适合耗时短的任务,因为如果耗时长的话,哗来一堆任务,每个任务都得起一个线程...原创 2020-11-27 19:27:13 · 3400 阅读 · 0 评论 -
DelayedWorkQueue原理
使用最小堆实现,最近要到达时间的节点放在堆顶,每个节点都会附带到期时间,依次作为堆调整的依据。看poll()的源码就明白延迟队列的秘密了 public RunnableScheduledFuture<?> poll() { final ReentrantLock lock = this.lock; lock.lock(); try { RunnableScheduledFutu原创 2020-11-27 19:21:26 · 465 阅读 · 0 评论 -
一张很好的jvm脑图
原创 2020-11-19 01:39:26 · 67 阅读 · 0 评论 -
G1与CMS各自的使用场景及原理
G1适合8/16G以上的内存使用,原因在于G1rescan更快,清除垃圾时虽然是stop the world但是可控,CMS虽然是并发但是不可控,大块内存要回收会影响到应用程序的性能。G1大体思路:在并发标记时,对象引用的变动会增加一个barrier, 就有了变动的log集合,rescan时只需要扫描log集合即可。CMS大体思路:G1垃圾收集器的讲解,RednaxelaFXCMS垃圾收集器的讲解...原创 2020-11-19 00:47:18 · 5247 阅读 · 0 评论 -
newCachedThreadPool第一个任务是怎么被捞起来的
newCachedThreadPool原创 2020-11-18 21:55:04 · 93 阅读 · 0 评论