亲缘性线程池,这是什么鬼?

等等,昨天在调试我们的订单处理系统时发生了一些奇怪的事情。
用户A每秒提交1 0个订单,所有订单号均以“ORD-A”为前缀。
系统日志中“ORD-A”的输出完全不连续,有的甚至插入到用户B的订单日志中间。
参数记不太清楚了。
测试中使用了4 个队列,每个队列容量为1 00。
内存监控显示队列峰值稳定在8 5 左右,没有出现溢出。
但是“ORD-A”的输出序列是……等等,我们把日志导出来看看。

用B的名字是“ORD-A”混合?这是不正确的。
我检查了线程池配置,发现实际上是使用newSerializingExecutor(4 ,1 00)。
默认为 4 个队列。
切换到8 个cue后,“ORD-A”的输出变得更加连续,但在某些情况下仍然会混合一些“ORD-B”。
这很有趣。
感觉线程池调度比我想象的要复杂很多。

JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....

Java并发关键知识点总结:
进程创建开销较高,而共享线程资源开销较低。

synchronized基于monitorenter/monitorexit,内部处理等待锁的线程。

ReentrantLock是手动释放的,功能丰富,synchronized是自动释放的,简单。

AQS通过CAS改变状态,失败的线程进入队列,使用AtomicStampedReference解决ABA问题。

区块类型:乐观/悲观、分布式、独占/共享、公平/不公平、可重入、轮换、分段。

IO模型:阻塞、非阻塞、多路复用、信号驱动、异步。

HashMap:1 .7 数组和链表,1 .8 添加红黑树,扩展条件超过容量负载因子。

ConcurrentHashMap:段块1 .7 ,数组1 .8 +链表+红黑树,更细粒度的块控制。

ArrayList数组的随机访问,LinkedList链表的插入和删除速度很快,不支持随机访问。

ThreadPoolExecutor:主线程数、最大线程数、空闲时间、任务队列、拒绝策略。

线程池拒绝策略:Abort、CallerRuns、DiscardOldest、Discard。

线程状态:新建、可执行、运行、锁定、等待、等待、完成。

死锁条件:互斥、占有等待、非抢占、循环等待。

预防死锁:破坏必要条件,例如顺序请求资源、设置超时等。

非阻塞编程:CAS、易失性、原子类。

Volatile 提供可见性,ThreadLocal 避免共享变量上的并发。

工作内存是CPU缓存,主内存是物理RAM。

JUC常用类:ConcurrentHashMap、BlockingQueue、CountDownLatch、CyclicBarrier、Semaphore、ReentrantLock、ReentrantReadWriteLock、CompletableFuture。