加载中

多线程

文章分类

浏览该分类下的所有文章

14 篇文章 2

使用Java写简单的网络DDos攻击(仅用于学习)

本文分析一段使用Java线程池和URLConnection实现的“DDoS”示例代码,指出其无限循环创建线程池、线程爆炸、资源泄漏、无超时、异常处理不当等设计缺陷,并警示其违反《刑法》《网络安全法》的法律风险。随后给出合法学习并发请求的改进建议:使用单一固定线程池、设置连接超时、复用连接池、采用try‑with‑resources并在授权范围内进行压力测试。强调技术应用于正当用途,维护网络安全。

深入解析CompletableFuture的设计哲学与实践

本文介绍了 Java 8 引入的 CompletableFuture 如何突破传统 Future 的回调缺失与组合困难,围绕函数式编程、Promise 思想构建链式、流式 API,实现异步任务的声明式组合。通过分析其内部状态机(未完成、正常完成、异常完成)和基于 Treiber 栈的依赖回调管理,阐明了组合能力的底层实现。随后以电商订单处理为例,展示并行检查库存、计算价格、扣减库存、生成结果等完整流程的实现,并加入异常、超时、批量 allOf 等实战技巧。最后归纳了条件执行、带重试的调用以及超时降级等高级模式,体现 CompletableFuture 在高效、可维护的异步服务构建中的核心价值。

Java虚拟线程(Project Loom):并发编程的新纪元

Java 21 引入的虚拟线程(Project Loom)是一种轻量级、由 JVM 调度的线程,创建和切换成本极低,可实现“每请求一个线程”的百万并发模型。它与现有并发 API 完全兼容,支持阻塞 IO、线程本地变量、调试监控,并可与结构化并发结合,实现更简洁的同步式代码。文章展示了在高并发 Web 服务器、批量数据处理和微服务聚合等场景的使用示例,提出避免不必要 pin、合理使用锁和 ThreadLocal 的最佳实践,并提供渐进式迁移策略。虚拟线程解决了传统线程的数量、上下文切换和内存开销瓶颈,预示着 Java 并发编程进入新纪元。

SpringBoot中ThreadLocal的妙用:原理、实战与避坑指南

SpringBoot 中常需在请求链路上传递用户、租户、TraceId 等信息,直接用参数会冗余,使用全局变量又存线程安全隐患。ThreadLocal 通过每条线程的 ThreadLocalMap 为线程保存独立副本,实现“线程私有”仓库。键为弱引用,若不在 finally 中手动 remove,值会随线程复用导致内存泄漏。文中示例了在 Filter/Interceptor 中设置并在 finally 中清理的 UserContextHolder,以及结合 MDC 实现全链路追踪。随后列出四大坑:①忘记 remove 导致泄漏;②子线程不继承导致空值(可用 InheritableThreadLocal 或阿里 TransmittableThreadLocal);③初始化时机不当导致 NPE;④事务 + @Async 丢失上下文。对应提供 remove、使用合适的 ThreadLocal 实现、懒加载、上下文传递等解决方案。最后强调及时清理、限定作用域、在复杂场景选用合适工具,避免与 Spring 事务等框架耦合,才能安全高效地利用 ThreadLocal 简化代码。

深入剖析Java volatile关键字:多线程下的可见性与有序性保障

Java volatile 是轻量级同步工具,保证对共享变量的写立即刷新到主内存并使其他线程的副本失效,从而实现可见性;通过在读写前后插入内存屏障,阻止指令重排,提供有序性。适合状态标志、一次性安全发布、独立观察等场景,但不保证复合操作的原子性,仍需 synchronized 或原子类。使用条件是写操作不依赖当前值且无需锁保护;相较 synchronized,volatile 读几乎无代价,写略慢但开销远低。正确理解其语义和实现,可在多线程程序中实现高效、可靠的线程间通信。

告别手动换算:一款为Java开发者打造的优雅延迟工具类

Thread.sleep()虽简单,却需手动毫秒换算、只能固定延迟且抛出Checked异常,导致代码冗余易错。文中提供DelayUtils工具类,封装秒、分、小时等多单位方法,内部统一处理InterruptedException,并支持指数退避等动态延迟。使用该类可省去换算和异常模板,提升可读性、灵活性和健壮性,推荐在多数业务场景中取代直接调用Thread.sleep().

Java并发编程:从volatile关键字到Atomic类的底层原理与实战

本文阐述了 Java 并发中的两种可见性与原子性保障手段。volatile 关键字通过强制读写主内存、禁止指令重排,实现变量的即时可见,适用于单一状态标记等轻量读写场景;而 java.util.concurrent.atomic 包提供的 Atomic 类利用硬件层面的 CAS 无锁算法,确保复合操作的原子性,避免 synchronized 的锁开销,适合计数、递增等高并发写场景。文章通过代码示例演示两者的使用方式,并对 volatile 与 Atomic 在适用场景、性能和数据一致性方面进行对比,强调在实际开发中需根据业务需求权衡选择,以实现高效且安全的并发控制。

Java并发工具类:从CountDownLatch到CyclicBarrier的实战应用

本文系统阐述了 Java 并发包中的两大同步工具——CountDownLatch 与 CyclicBarrier。CountDownLatch 通过计数器让一个或多个线程等待指定次数的任务完成后再继续,适用于“一次性”任务汇总;示例展示了主线程阻塞直至三个子线程调用 countDown()。CyclicBarrier 则让一组线程在同一屏障点相互等待,计数归零后所有线程一起放行,并且可以循环使用,适合多轮协同处理;示例演示了三条线程在 barrier.await() 后同步继续。文章比较了两者的设计理念与使用场景,强调掌握这些工具可提升 Java 并发程序的效率和可靠性。

Java并发编程:深入理解Synchronized关键字与ReentrantLock

文章比较了Java的两种锁:synchronized是语言层面的内置锁,支持实例、类和代码块的不同粒度,可重入但默认非公平,使用简洁安全;ReentrantLock位于java.util.concurrent.locks,提供显式加锁、可选公平或非公平、Condition等高级特性,需手动释放。结论是:简单同步首选synchronized,需细粒度控制或条件等待时使用ReentrantLock。

Java面试必会知识点

抱歉,我无法直接访问该链接中的内容。请您把文章的正文粘贴在这里,我会根据提供的文本为您生成符合要求的摘要。

面试现场【综合篇】

面试现场综合篇提供了一套完整的技术面试指南,涵盖项目亮点、代码设计、零拷贝实现方式、五大IO模型及NIO与多路复用差异、Future阻塞获取原理、ReentrantLock 与 synchronized 的区别与实现、AQS、乐观/悲观锁、Paxos 协议、B+树特性、TCP 拥塞控制、JVM 实践、分库分表弊端、分布式事务(包括 TCC)以及 RocketMQ 的可靠性保障等热点话题,并配以原理解析和实现要点,帮助面试者系统复习核心概念与面试要点。

面试现场【多线程篇】

多线程用于提升资源利用率和CPU并发能力,常见于高并发、耗时任务、定时任务等场景。线程安全指在多线程访问同一对象时无需额外同步仍能得到正确结果,处理方式包括原子类、并发集合、CountDownLatch、Semaphore、synchronized、Lock、分布式锁等。synchronized 通过 monitorenter/monitorexit 实现对象监视器锁,方法级使用 ACC_SYNCHRONIZED 标记。与 ReentrantLock 相比,后者需手动释放、可设公平性、支持可中断、超时和 tryLock。公平锁按请求顺序获取,非公平锁则不保证。CAS(Compare‑And‑Swap)是乐观锁实现,Atomic 类等基于 CAS 进行无锁同步。