随笔分类 -  多线程与异步编程

摘要:一、ThreadLocal 内存泄漏的原因 ThreadLocal 的内存泄漏问题主要与其底层实现 ThreadLocalMap 的结构和垃圾回收机制有关。以下是核心原因: 1、ThreadLocalMap 的 Entry 设计 键(Key)是弱引用:ThreadLocalMap 中的键(Key)是 阅读全文
posted @ 2025-03-04 16:47 jock_javaEE 阅读(1271) 评论(0) 推荐(0)
摘要:一、定义 CyclicBarrier 的 await() 方法是其核心功能之一,用于让线程在屏障点等待,直到所有参与的线程都到达屏障后,才能继续执行。 其底层实现依赖于 AQS(AbstractQueuedSynchronizer) 和 ReentrantLock,以下是 await() 方法的底层 阅读全文
posted @ 2025-03-03 21:32 jock_javaEE 阅读(106) 评论(0) 推荐(0)
摘要:一、release() 方法代码解析 当调用 release() 方法时,实际调用的是 AQS 的 releaseShared(1) 方法。以下是其详细工作流程: public final boolean releaseShared(int arg) { if (tryReleaseShared(a 阅读全文
posted @ 2025-03-03 15:38 jock_javaEE 阅读(90) 评论(0) 推荐(0)
摘要:一、acquire() 的工作流程 当调用 acquire() 方法时,实际调用的是 AQS 的 acquireSharedInterruptibly(1) 方法。以下是其详细工作流程: // acquire() -> sync.acquireSharedInterruptibly(1),可中断 p 阅读全文
posted @ 2025-03-03 15:03 jock_javaEE 阅读(180) 评论(0) 推荐(0)
摘要:一、简单使用 在聊它的源码之前,我们先来做个简单的使用说明。当我在IDEA中创建了一个简单的Demo之后,它会给出以下提示 提示文字 在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在finally中无法解锁。 1 阅读全文
posted @ 2025-03-01 23:38 jock_javaEE 阅读(67) 评论(0) 推荐(0)
摘要:一、CountDownLatch的构造方法 // 创建倒数闩,设置倒数的总数State的值 CountDownLatch doneSignal = new CountDownLatch(N); 二、countDown() 方法的作用 countDown() 方法的主要作用是将 CountDownLa 阅读全文
posted @ 2025-03-01 21:46 jock_javaEE 阅读(137) 评论(0) 推荐(0)
摘要:一、定义 release(int) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下释放同步状态。如果释放成功,则会唤醒等待队列中的后继节点,使其有机会获取同步状态 1、release(int) 方法的作用 功能:释放同步状态(独占模式),并唤醒等 阅读全文
posted @ 2025-02-28 11:38 jock_javaEE 阅读(68) 评论(0) 推荐(0)
摘要:一、定义 acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态。如果当前线程无法获取同步状态,则将其加入等待队列并阻塞,直到成功获取同步状态或被中断 1、acquire(int arg) 方法的作用 功能: 阅读全文
posted @ 2025-02-28 01:24 jock_javaEE 阅读(210) 评论(0) 推荐(0)
摘要:一、定义 ThreadPoolExecutor 的内部类 Worker 是线程池的核心实现之一,它封装了线程和任务,并负责执行任务。Worker 类继承自 AbstractQueuedSynchronizer(AQS), 并实现了 Runnable 接口。通过 Worker,线程池能够高效地管理线程 阅读全文
posted @ 2025-02-23 01:08 jock_javaEE 阅读(135) 评论(0) 推荐(0)
摘要:一、详细介绍FutureTask类 FutureTask 未来将要执行的任务对象,继承 Runnable、Future 接口,用于包装 Callable 对象,实现任务的提交 public static void main(String[] args) throws ExecutionExcepti 阅读全文
posted @ 2025-02-22 21:03 jock_javaEE 阅读(130) 评论(0) 推荐(0)
摘要:一、详细介绍java的线程池状态 Java 中的线程池状态是 ThreadPoolExecutor 类内部管理的一个重要概念。线程池的状态决定了线程池的行为,例如是否接受新任务、是否处理队列中的任务、是否中断正在执行的任务等。 线程池的状态通过一个 AtomicInteger 变量(ctl)来表示, 阅读全文
posted @ 2025-02-22 18:48 jock_javaEE 阅读(302) 评论(0) 推荐(0)
摘要:一、LongAdder继承Striped64类 abstract class Striped64 extends Number { // CPU核数,用来决定cells数组的大小 static final int NCPU = Runtime.getRuntime().availableProces 阅读全文
posted @ 2024-06-26 17:28 jock_javaEE
摘要:一、CountDownLatch 原理 1、CountDownLatch在多线程并发编程中充当一个计时器的功能,并且内部维护一个count的变量,并且其操作都是原子操作,该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即 阅读全文
posted @ 2024-06-21 21:04 jock_javaEE
摘要:一、ThreadPoolExecutor线程池底层原理分析 构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<R 阅读全文
posted @ 2024-06-16 20:40 jock_javaEE
摘要:场景A、假设ThreadLocalMap中的key使用了强引用,那么会出现内存泄漏吗 ? 1、假设在业务代码中使用完ThreadLocal对象,ThreadLocalRef引用 会被回收了 2、但因为ThreadLocalMap的Entry中key强引用了ThreadLocal对象,造成该对象无法被 阅读全文
posted @ 2024-06-06 23:40 jock_javaEE
摘要:public class AtomicIntegerTest { public static void main(String[] args) { AtomicInteger at = new AtomicInteger(2); int andSet = at.getAndSet(12); int 阅读全文
posted @ 2024-06-03 17:59 jock_javaEE
摘要:import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class CallableTest { public static void main(String[] args) { Cal 阅读全文
posted @ 2024-05-27 00:31 jock_javaEE
摘要:线程生命周期的六种状态 New (新建) Running (可运行) Blocked (被阻塞) Waiting (等待) Timed Waiting (计时等待) Terminated (被终止) 在我们程序编码中如果想要却动线程当前的状态,可以通过getState()方法来获取,同时我们需要注意 阅读全文
posted @ 2024-05-21 19:45 jock_javaEE
摘要:public class RunableTest { public static void main(String[] args) { Person person = new Person(); Thread thread = new Thread(person); thread.start(); 阅读全文
posted @ 2024-05-20 22:57 jock_javaEE
摘要:public class ThreadTest { public static void main(String[] args) throws InterruptedException { //创建 Cat 对象,可以当做线程使用 Thread cat = new Cat(); cat.start( 阅读全文
posted @ 2024-05-20 22:49 jock_javaEE