JAVA并发
haikuc
这个作者很懒,什么都没留下…
展开
-
ReentrantLock重复唤醒,park失效的问题
当使用lockInterruptibly的时候,如果人为中断线程,排在这个线程之后的线程可能会被unpark两次。这样在业务代码中就会出现park不住的情况。问题描述按以下步骤执行:A线程lockB线程lockInterruptiblyC线程lock到现在为止A获得锁,B线程是等待队列头节点后的下一个节点,C在B之后。interrupt B线程,在cancelAcquire中的unparkSuccessor打断点。A线程unlock,在unparkSuccessor打断点。然后让B线程和原创 2020-11-29 16:48:38 · 697 阅读 · 1 评论 -
【JUC源码】ThreadPoolExcutor中非成对的锁
ThreadPoolExcutor中的runWorker中最开始有一个w.unlock(),然而前面并没有w.lock()。注释中写的是允许打断,这是什么意思?final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; // 这是什么东西??? w.unlock(); // allow int原创 2020-11-28 21:53:12 · 203 阅读 · 0 评论 -
转自JEP的@sun.misc.contended行为说明
JEP-142: Reduce Cache Contention on Specified Fields用在类上类的代码 @Contended public static class ContendedTest2 { private Object plainField1; private Object plainField2; private Object plainField3; private Object plainField4; }对象的大小原创 2020-09-29 20:25:49 · 206 阅读 · 0 评论 -
ConcurrentHashMap1.8的一个bug!
第二遍看ConcurrentHashMap的过程中注意到了一个细节。几乎把网上的博客都找遍了也没找到合理的解释,最后发现是一个bug。。。。。private final void addCount(long x, int check) { //... if (check >= 0) { Node<K,V>[] tab, nt; int n, sc; while (s >= (long)(sc = sizeCtl) &a原创 2020-08-02 15:26:32 · 291 阅读 · 1 评论 -
【JUC源码】线程池ThreadPoolExecutor
线程池整体结构线程池就是很多线程加一个存储任务的阻塞队列,这些线程会不停的从阻塞队列中拿任务,然后执行。一般线程池会有一些参数:核心线程数:核心线程默认是不会结束了,一直会等待新的任务到来最大线程数:当核心线程都在处理任务,阻塞队列也满了,那就会创建一些救急线程。救急线程数+核心线程数就是最大线程数。下图就描述了往线程池中提交一个任务的整体流程。注意线程池里面刚开始是没有线程的。ThreadPoolExecutor接下来看看ThreadPoolExecutor从submit开始的整体原创 2020-08-01 14:29:52 · 195 阅读 · 0 评论 -
【JUC源码】图解LongAdder
简介本文介绍了LongAdder的的整体流程。LongAdder和AtomicLong的区别通俗地讲,AtomicLong对象用 一个 long类型的内部变量存储值,多个线程得交替执行累加操作。LongAdder用 多个 long类型的内部变量存储值,多个线程可以一起执行累加操作。下图中一个箭头就代表一个线程。怎么实现的呢?因为现在除了一个base,还有好多个cell,每个cell里面存的都是一个long类型的值。那很多线程一起来的时候,就让不同的线程加到不同的cell里面去就好了,最后想要获原创 2020-07-31 19:15:06 · 330 阅读 · 0 评论 -
批量重偏向和批量撤销理解
简介本文记录一下自己看b站juc视频的一点疑惑。视频地址重偏向的时候,撤销次数会增加吗? 不会一个被重偏向完的对象,还能被第二次重偏向吗? 不能不清楚的朋友可以往下看一看,应该能有所收获。实验代码package cn.itcast.test;import lombok.extern.slf4j.Slf4j;import org.openjdk.jol.info.ClassLayout;import java.util.Vector;import java.util.concurre原创 2020-07-30 21:21:36 · 2450 阅读 · 7 评论 -
【JUC源码】FutureTask详解
简介本文主要分析FutureTask的实现原理,以运行过程中state的变化为切入点,最终把整个过程归纳为三张流程图。FutureTask的整体结构private volatile int state; // 标记当前运行状态private Callable<V> callable; // 实际运行的代码private Object outcome; // callable运行结果private volatile Thread runner; // 运行callable的线程原创 2020-07-29 16:58:57 · 343 阅读 · 0 评论