# thread-series **Repository Path**: xh-java-base/thread-series ## Basic Information - **Project Name**: thread-series - **Description**: 多线程学习系列 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-10-10 - **Last Updated**: 2025-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多线程相关 # 一、common(常用) - [资源](md/0023002300-common/2023022300-resource/resource.md) - [基础测试代码工程](md/0023002300-common/2023042300-base-test-code/base-test-code.md) # 二、util(一些特别的使用) 0075022300-util # 三、base - [查看 jvm 线程](md/2323032300-base/3023002300-check-jvm-thread/check-jvm-thread.md) - [java 中创建线程的方式](md/2323032300-base/3043003200-create/create.md) - [守护线程与用户线程](md/2323032300-base/3043032300-daemon-user-thread/daemon-user-thread.md) - [线程上下文切换](md/2323032300-base/3043007200-context-switch/context-switch.md) - [线程状态(生命周期)](md/2323032300-base/4217002300-线程状态/线程状态.md) - [线程池应该设置为静态变量还是动态变量](md/2323032300-base/4217006700-线程池应该设置为静态变量还是动态变量/线程池应该设置为静态变量还是动态变量.md) # 四、核心知识点(core point) - [unsafe](md/2357032300-core-point/2423032300-unsafe/unsafe.md) - [cas](md/2357032300-core-point/0005002300-cas/cas.md) - [ThreadLocal](md/2357032300-core-point/0005005700-threadlocal/threadlocal.md) # 五、线程之间的协作(communicate between threads) - [join](md/2423035700-communicate-between-threads/0007002300-join/join.md) - [sleep](md/2423035700-communicate-between-threads/0007002700-sleep/sleep.md) - [yield](md/2423035700-communicate-between-threads/0007003400-yield/yield.md) - [interrupt - 线程中断](md/2423035700-communicate-between-threads/0007004600-interrupt/interrupt.md) - [wait 与 notify](md/2423035700-communicate-between-threads/0007005300-wait-notify/wait-notify.md) # 六、并发编程的三大特性 并发编程的三大特性,也就是 java 内存模型(Java Memory Model 简称 JMM)的三大特性,指的是: 原子性、可见性、有序性。 - [java 内存模型(JMM) 与 jvm 内存模型](md/2457035700-并发编程的三大特性/0005001200-java-内存模型-与-jvm-内存模型/java-内存模型-与-jvm-内存模型.md) - [并发编程的三大特性 - 介绍](md/2457035700-并发编程的三大特性/0005002300-并发编程的三大特性-介绍/并发编程的三大特性-介绍.md) - [并发编程的三大特性 - 原子性](md/2457035700-并发编程的三大特性/0012012300-原子性/原子性.md) - [并发编程的三大特性 - 可见性](md/2457035700-并发编程的三大特性/0012022300-可见性/可见性.md) - [并发编程的三大特性 - 有序性](md/2457035700-并发编程的三大特性/0012032300-有序性/有序性.md) # 七、lock ### 1. base - [锁的分类(java 中的分类)](md/3223035700-lock/1223025700-base/0023025700-锁的分类/锁的分类.md) - [ReentrantLock 和 synchronized 的区别](md/3223035700-lock/1223025700-base/0067025700-ReentrantLock-和-synchronized-的区别/ReentrantLock-和-synchronized-的区别.md) ### 2. synchronized - [synchronized 介绍(旧版)](md/3223035700-lock/2223025700-sync/0223025700-synchronized-介绍/sync-outline.md) - synchronized 类锁 和 对象锁 - [synchronized 的优化](md/3223035700-lock/2223025700-sync/0223065700-synchronized-的优化/synchronized-的优化.md) - [synchronized 锁升级](md/3223035700-lock/2223025700-sync/0223082300-synchronized-锁升级/synchronized-锁升级.md) - [synchronized 的锁降级 和 自旋](md/3223035700-lock/2223025700-sync/0223085300-synchronized-的锁降级-和-自旋/synchronized-的锁降级-和-自旋.md) - [synchronized 重量级锁底层 ObjectMonitor](md/3223035700-lock/2223025700-sync/0223135700-synchronized-重量级锁底层-ObjectMonitor/synchronized-重量级锁底层-ObjectMonitor.md) ### 3. aqs > 线程A 挂起后,需要有一个 线程B 来唤醒 线程A,在 AQS 的双向链表中,这个 线程B 就是 线程A 的前一个节点。 - [AQS (V1 介绍)](md/3223035700-lock/2323032300-aqs/0023025700-aqs/aqs.md) - [AQS 的重要属性](md/3223035700-lock/2323032300-aqs/0037032300-aqs-重要属性/aqs-重要属性.md) ### 4. ReentrantLock 分析 > FairSync(公平锁) 或者 NonfairSync(非公平锁) 都是基于 AQS 的 state 属性和双向链表实现的。 > FairSync(公平锁) 是直接把线程封装成 Node 对象,放到 AQS 双向链表中。 NonfairSync(非公平锁) 会先尝试获取锁,再放到 AQS 双向链表。 *** FairSync(公平锁) 和 FairSync(公平锁) 的区别,两个都是把等待锁的线程放到双向链表中。 公平锁就是大家都正常排队。 非公平锁在加入双向链表的整个过程,最后一个节点好几次尝试获取锁,如果最后成功加入双向队列,就正常排队。 ### 5. Condition - [Condition 使用示例](md/3223035700-lock/3323025700-condition/0057022300-condition-使用示例/condition-使用示例.md) ### 6. ReentrantReadWriteLock - [ReentrantReadWriteLock 介绍](md/3223035700-lock/4323025700-reentrant-read-write-lock/0043025700-ReentrantReadWriteLock-介绍/ReentrantReadWriteLock-介绍.md) - [ReentrantReadWriteLock 使用示例(一): 读读、读写、写写 示例](md/3223035700-lock/4323025700-reentrant-read-write-lock/0073001100-ReentrantReadWriteLock-使用示例1/ReentrantReadWriteLock-使用示例1.md) - [ReentrantReadWriteLock 使用示例(二): 设计线程安全的 Map](md/3223035700-lock/4323025700-reentrant-read-write-lock/0073002200-ReentrantReadWriteLock-使用示例2/ReentrantReadWriteLock-使用示例2.md) - [读写锁的实现原理](md/3223035700-lock/4323025700-reentrant-read-write-lock/0123025700-读写锁的实现原理/读写锁的实现原理.md) *** - [重入锁、公平锁与非公平锁](md/3223035700-lock/fair-and-nonfair-lock/fair-and-nonfair-lock.md) - [StampedLock-邮戳锁](md/3223035700-lock/stamped/stamped.md) - [LockSupport](md/3223035700-lock/support/support.md) # 八、Lock 源码 ### aqs 加锁相关源码: - [AQS 源码方法注释 -- acquire() 方法](md/3257032300-lock-source/2323032300-aqs/0052022300-aqs-源码方法注释-acquire-方法/aqs-源码方法注释-acquire-方法.md) - [AQS 源码方法注释 -- addWaite() 方法](md/3257032300-lock-source/2323032300-aqs/0052023300-aqs-源码方法注释-addWaite-方法/aqs-源码方法注释-addWaite-方法.md) - [AQS 源码方法注释 -- acquireQueued() 方法](md/3257032300-lock-source/2323032300-aqs/0052024300-aqs-源码方法注释-acquireQueued-方法/aqs-源码方法注释-acquireQueued-方法) - [AQS 源码方法注释 -- tryAcquireNanos() 和 doAcquireNanos() 方法](md/3257032300-lock-source/2323032300-aqs/0052025300-aqs-源码方法注释-tryAcquireNanos-和-doAcquireNanos-方法/aqs-源码方法注释-tryAcquireNanos-和-doAcquireNanos-方法.md) - [AQS 源码方法注释 -- cancelAcquire() 方法](md/3257032300-lock-source/2323032300-aqs/0052026300-aqs-源码方法注释-cancelAcquire-方法/aqs-源码方法注释-cancelAcquire-方法.md) - [AQS 源码方法注释 -- doAcquireInterruptibly() 方法](md/3257032300-lock-source/2323032300-aqs/0052027300-aqs-源码方法注释-doAcquireInterruptibly-方法/aqs-源码方法注释-doAcquireInterruptibly-方法.md) *** 释放锁相关源码: - [AQS 方法源码注释 -- release() 方法](md/3257032300-lock-source/2323032300-aqs/0065022300-aqs-源码方法注释-release-方法/aqs-源码方法注释-release-方法.md) ### 2. ReentrantLock 分析 - [ReentrantLock 加锁流程分析(总的)](md/3257032300-lock-source/2423032300-reentrant-lock/0057022300-ReentrantLock-加锁流程分析/ReentrantLock-加锁流程分析.md) - [ReentrantLock 源码 -- lock() 方法](md/3257032300-lock-source/2423032300-reentrant-lock/0523022300-ReentrantLock-源码-lock-方法/ReentrantLock-源码-lock-方法.md) - [ReentrantLock 源码 -- tryAcquire() 方法](md/3257032300-lock-source/2423032300-reentrant-lock/0523024300-ReentrantLock-源码-tryAcquire-方法/ReentrantLock-源码-tryAcquire-方法.md) *** - [ReentrantLock 源码 -- tryLock() 方法](md/3257032300-lock-source/2423032300-reentrant-lock/0523042300-ReentrantLock-源码-tryLock-方法/ReentrantLock-源码-tryLock-方法.md) - [ReentrantLock 源码 -- tryLock(long timeout, TimeUnit unit) 方法](md/3257032300-lock-source/2423032300-reentrant-lock/0523043300-ReentrantLock-源码-tryLock-含超时参数-方法/ReentrantLock-源码-tryLock-含超时参数-方法.md) ### 3. Condition - [Condition 的构建方式 和 核心属性](md/3257032300-lock-source/2457032300-condition/0057026700-condition-的构建方式-和-核心属性/condition-的构建方式-和-核心属性.md) - [Condition 源码方法注释 -- await() 方法(前面部分:到线程挂起)](md/3257032300-lock-source/2457032300-condition/0723002300-condition-源码方法注释-await-方法/condition-源码方法注释-await-方法.md) - [Condition 源码方法注释 -- signal() 方法](md/3257032300-lock-source/2457032300-condition/0723003300-condition-源码方法注释-signal-方法/condition-源码方法注释-signal-方法.md) - [Condition 源码方法注释 -- await() 方法(后面部分:线程挂起之后)](md/3257032300-lock-source/2457032300-condition/0723004300-condition-源码方法注释-await-方法-线程挂起之后/condition-源码方法注释-await-方法-线程挂起之后.md) - [Condition 源码方法注释 -- awaitNanos() 方法](md/3257032300-lock-source/2457032300-condition/0723005300-condition-源码方法注释-awaitNanos-方法/condition-源码方法注释-awaitNanos-方法.md) - [Condition 源码方法注释 -- signalAll() 方法](md/3257032300-lock-source/2457032300-condition/0723006300-condition-源码方法注释-signalAll-方法/condition-源码方法注释-signalAll-方法.md) ### 6. ReentrantReadWriteLock - [写锁加锁源码](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0623025700-写锁加锁源码/写锁加锁源码.md) - [写锁释放锁源码](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0623035700-写锁释放锁源码/写锁释放锁源码.md) *** - [读锁加锁流程(TODO)]() - [读锁加锁源码](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0823045700-读锁加锁源码/读锁加锁源码.md) - 读锁重入流程(TODO) - [读锁加锁的后续逻辑 fullTryAcquireShared](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0823065700-fullTryAcquireShared/fullTryAcquireShared.md) - [读线程在AQS队列获取锁资源的后续操作](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0823075700-读线程在AQS队列获取锁资源的后续操作/读线程在AQS队列获取锁资源的后续操作.md) - [读锁的释放锁流程](md/3257032300-lock-source/2523032300-reentrant-read-write-lock/0823085700-读锁的释放锁流程/读锁的释放锁流程.md) # val -- 原子操作类 atomic 1. [volatile 关键字](md/val/volatile/volatile.md) 2. [atomic 包](md/val/atomic/atomic.md) 3. [AtomicFieldUpdater 原子修改类中的字段(AtomicIntegerFieldUpdater 与 AtomicReferenceFieldUpdater)](md/val/003AtomicFieldUpdater/AtomicFieldUpdater.md) # 六、阻塞队列 - [阻塞队列基础介绍](md/0072005700-block-queue/0023042300-阻塞队列基础介绍/阻塞队列基础介绍.md) - [`ConcurrentLinkedQueue` 中的 `size()` 方法是 `O(n)` 的 -- 导致一个请求耗时两分多钟](md/0072005700-block-queue/0057022300-ConcurrentLinkedQueue-size/ConcurrentLinkedQueue-size.md) # 并发容器 Concurrent # 八、线程池 ### 1. thread pool base - [线程池关闭(含线程池是否关闭状态判断)](md/2023022300-thread-pool/0023052300-thread-pool-base/3023042300-线程池关闭/线程池关闭.md) ### 2. jdk 自带的构建线程池的方式 - [介绍与汇总](md/2023022300-thread-pool/1023022300-jdk-自带的构建线程池的方式/0223022300-介绍与汇总/介绍与汇总.md) - [newCachedThreadPool](md/2023022300-thread-pool/1023022300-jdk-自带的构建线程池的方式/2023022300-newCachedThreadPool/newCachedThreadPool.md) - [newFixedThreadPool](md/2023022300-thread-pool/1023022300-jdk-自带的构建线程池的方式/2023032300-newFixedThreadPool/newFixedThreadPool.md) - [newScheduledThreadPool](md/2023022300-thread-pool/1023022300-jdk-自带的构建线程池的方式/2023042300-newScheduledThreadPool/newScheduledThreadPool.md) - [newSingleThreadExecutor](md/2023022300-thread-pool/1023022300-jdk-自带的构建线程池的方式/2023052300-newSingleThreadExecutor/newSingleThreadExecutor.md) ### 3. ThreadPoolExecutor 应用 - [自定义线程池参数介绍](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1023042300-自定义线程池参数介绍/自定义线程池参数介绍.md) - [获取各种线程池状态数据](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1023062300-获取各种线程池状态数据/获取各种线程池状态数据.md) - [线程池拒绝策略](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1023082300-线程池拒绝策略/线程池拒绝策略.md) - [自定义线程创建工厂 ThreadFactory](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1023112300-custom-ThreadFactory/custom-ThreadFactory.md) - [线程异常处理](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1023132300-线程异常处理/线程异常处理.md) - [自定义线程池 -- 示例一](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1057022300-自定义线程池-示例一/自定义线程池-示例一.md) - [自定义线程池 -- 示例二](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/1057023300-自定义线程池-示例二/自定义线程池-示例二.md) - [核心线程超时销毁示例](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/4023023100-核心线程超时销毁示例/核心线程超时销毁示例.md) - [线程池预启动](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/4057023100-线程池预启动/线程池预启动.md) - [线程与线程池切面](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/4057023200-线程与线程池切面/线程与线程池切面.md) - [移除线程池中的任务](md/2023022300-thread-pool/2023022300-ThreadPoolExecutor-应用/4123023100-移除线程池中的任务/移除线程池中的任务.md) ### 4. ThreadPoolExecutor 源码 ### 5. ScheduleThreadPoolExecutor 应用 ### 6. ScheduleThreadPoolExecutor 源码 # tool 1. [phaser](./md/tool/phaser/phaser.md) 2. [random](./md/tool/random/random.md) 3. [Accumulator(Addr) -- 高性能累加器](./md/tool/accumulator/accumulator.md) # design-pattern 1. [经典分治模型 fork-join](./md/design-pattern/fork-join/fork-join.md) 2. [future](./md/design-pattern/futrue/futrue.md) # 源码解析 1. [`java.util.concurrent.Executor` 解读](md/source/001executor/executor.md) 2. [`java.util.concurrent.Future` 解读](md/source/002future/future.md) 3. [`java.util.concurrent.atomic.AtomicIntegerFieldUpdater` 解读](md/source/003java.util.concurrent.atomic.AtomicIntegerFieldUpdater/java.util.concurrent.atomic.AtomicIntegerFieldUpdater.md) 4. [`java.util.concurrent.atomic.AtomicReferenceFieldUpdater` 解读](md/source/004java.util.concurrent.atomic.AtomicReferenceFieldUpdater/java.util.concurrent.atomic.AtomicReferenceFieldUpdater.md) # util - [如何判断线程池任务已执行完?](md/util/001determine-thread-pool-task-has-been-completed/determine-thread-pool-task-has-been-completed.md) 问题: 线程池的核心线程和非核心线程 能区分吗?(简单的问,他们有不同的标识吗) 问一个问题,已知一个线程池线程存活时间设置的60s,目前三核心线程是3,非核心也是3,那么我每10秒一个任务,请问,2分钟后,线程池里还剩多少个线程,提示:这些线程都是提前创好了的哦