第042篇 CountDownLatch 与 CyclicBarrier:等待与协作
本文深入解析`CountDownLatch`、`CyclicBarrier`与`Semaphore`的核心差异与实战陷阱:前者为一次性事件门闩,后者为可复用集合点,`Semaphore`则基于独占模式限流。重点剖析“计数未归零阻塞”“屏障损坏”“许可泄漏”等生产级坑点,并给出`finally`防护、超时兜底、参与方一致性等落地解法,助你面试直击采分关键。
第040篇 volatile:可见性、有序性与禁止重排
`volatile` 是Java轻量级同步机制,核心解决**可见性**与**有序性**(靠内存屏障实现),但**不保证原子性**。典型适用:状态标志、引用发布、DCL单例;禁用场景:`count++`、多变量一致性、检查后动作——这些须用原子类或锁。
第044篇 ThreadLocal 原理:主线程到底能不能用
ThreadLocal核心在于“线程独享+弱引用Key+强引用Value”:每个线程持独立ThreadLocalMap,Key为ThreadLocal弱引用,Value强引用用户对象;若不显式remove,线程池复用时易致内存泄漏与数据串号。务必在finally中清理!
第039篇 synchronized 原理:对象头、锁升级与重量级锁
`synchronized` 底层依托对象头 Mark Word 与 `monitorenter` 指令,锁随竞争升级:无锁 → 偏向锁(JDK15 已废弃)→ 轻量级锁(CAS 自旋)→ 重量级锁(ObjectMonitor + 内核阻塞)。`wait` 必在同步块内调用,确保条件检查与等待原子性。
第041篇 线程池七参数:ThreadPoolExecutor 从配置到调优
Android面试高频题“线程池七参数”,实为三层能力筛选:背参数(入门)、讲流程(进阶)、析设计(高手)。核心在于理解`corePoolSize→workQueue→maximumPoolSize→RejectedExecutionHandler`的执行链与制约关系,避开无界队列、线程命名缺失、拒绝策略误用等典型坑。真懂者必知:参数非独立旋钮,而是协同约束。
第038篇 Thread 与 Runnable:线程生命周期全解
Thread与Runnable本质是“任务”与“执行单元”的分离:Runnable仅定义要做的事(无返回、不抛检异常),Thread负责调度执行(含状态、优先级、生命周期控制)。`start()`才真正启新线程,`run()`只是普通方法调用。常见坑包括误调`run`导致伪并发、异常静默终止、持有Activity引发内存泄漏。工程中应优先使用线程池而非裸Thread。
边框与圆角:单边边框、多值圆角与布局影响
本文详解jquick-pdf中边框与圆角的精准控制:支持`border`(四边)及`borderLeft`等单边属性,值为“类型 宽度 颜色”三段式;`borderRadius`支持1–4值灵活设角,亦可单独指定四角。强调边框影响内容宽度、分页与视觉层次,需配合`padding`/`margin`使用,并注意阅读器兼容性。
第037篇 动态代理:AOP 与框架的基石
动态代理本质是运行期生成代理类,统一转发调用至InvocationHandler。JDK代理限于接口,CGLIB通过子类代理非final类。核心难点在于:代理对象与目标实例不同、方法体动态生成、this自调用绕过代理——这三点正是区分“读文档”与“写框架”的关键试金石。
第027篇 ArrayList 源码与扩容机制:1.5 倍增长的细节
ArrayList面试高频题:JDK8中无参构造不分配数组,首次add才扩容至10;后续按1.5倍增长,不足时直取所需容量,上限为Integer.MAX_VALUE-8。扩容本质是Arrays.copyOf整段拷贝。关键要懂原理、避坑(如预估容量、非线程安全、subList陷阱)并结合工程实践。