首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
憶夣
累计撰写
57
篇文章
累计创建
11
个标签
累计收到
2
条评论
栏目
首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
目 录
CONTENT
Java并发编程实战-憶夣
以下是
Java并发编程实战
相关的文章
2023-04-04
3、活跃性、性能与测试
## 摘要 本文介绍了Java并发编程中的活跃性、性能与测试三大核心问题。 **避免活跃性危险**(第10章):重点阐述**死锁**的成因、类型(锁顺序死锁、动态锁顺序死锁、协作对象间死锁、资源死锁)及预防策略。核心方法是**以固定顺序获取锁**,尽量使用**开放调用**(在调用外部方法时不持有锁)来降低死锁风险。此外还介绍了饥饿、活锁等活性问题,指出应避免滥用线程优先级,活锁可通过引入随机退避机制解决。 **性能与可伸缩性**(第11章):指出串行化操作是可伸缩性的主要瓶颈,通过**Amdahl定律**量化并行加速上限。提升可伸缩性的关键策略包括:**缩短锁持有时间、减小锁粒度**(锁分解、锁分段)、**避免热点域**、使用读写锁与原子变量替代独占锁、以及将阻塞I/O操作分离到独立线程以减少上下文切换开销。应优先关注吞吐量而非单次操作速度,并以测试而非猜测为优化依据。 **并发程序测试**(第12章):测试分为安全性测试与活跃性测试,并通过性能指标(吞吐量、响应性、可伸缩性)进行衡量。安全性测试需验证不变性条件,可借助**校验和比对**和**多线程压力测试**(如PutTakeTest)暴露数据竞争。性能测试需警惕垃圾回收、动态编译、代码消除等陷阱,应确保测试运行足够长时间以获得稳定结果。同时建议结合**代码审查、静态分析工具**和**性能监测工具**来全面保障并发程序的质量。
2023-04-04
56
0
0
Java
2023-04-04
2、结构化并发应用程序
本文总结了《Java并发编程实战》中关于结构化并发应用程序的核心内容,主要涵盖任务执行、取消与关闭、线程池使用三部分: **1. 任务执行(第六章)** 围绕任务边界设计程序,将任务提交与执行策略解耦是关键。相较于无限制创建线程(存在资源耗尽与稳定性风险)或串行执行(吞吐量低),推荐使用**Executor框架**。通过线程池(如Fixed、Cached线程池)重用线程以提升性能与稳定性;对于携带结果的任务,使用**Callable与Future**;若需批量获取完成结果,可借助**CompletionService**;同时可利用`Future.get`设置超时来实现限时任务。 **2. 取消与关闭(第七章)** Java没有安全抢占式停止线程的方法,取消操作依赖协作式中断机制。任务应通过轮询中断状态或响应`InterruptedException`来实现取消。对于不响应中断的阻塞(如同步Socket I/O),需通过关闭底层资源来变相取消。服务(如线程池)应提供生命周期方法(如平缓的`shutdown`或粗暴的`shutdownNow`),也可使用“毒丸”对象确保队列任务处理完毕。此外,需通过`UncaughtExceptionHandler`防范未捕获异常导致的线程非正常消亡,并合理利用JVM关闭钩子进行资源清理。 **3. 线程池配置(第八章)** 并非所有任务都适合所有执行策略。依赖性任务或使用线程封闭的任务会与执行策略产生隐性耦合,甚至引发线程饥饿死锁。线程池大小需根据任务类型(CPU密集型或I/O密集型)及系统资源动态调节。深入**ThreadPoolExecutor**配置至关重要:需合理选择有界/无界队列、饱和策略(如CallerRunsPolicy实现流量控制),并通过定制ThreadFactory与扩展钩子方法(如beforeExecute、terminated)来实现监控、日志与统计等增强功能。
2023-04-04
61
0
0
Java
2023-04-04
1、基础知识
本文摘自Java并发编程经典书籍,系统介绍了并发编程的基础知识,涵盖线程概念、安全性、对象共享与组合以及常用构建模块。 **第一章**阐述了线程的起源、优势(充分利用多处理器、简化建模、异步事件处理、提升UI响应)以及带来的风险(安全性问题如竞态条件、活跃性问题如死锁、性能开销如上下文切换)。指出线程在现代Java应用中无处不在,如Timer、Servlet、RMI、Swing等框架均依赖线程。 **第二章**聚焦线程安全性,定义了线程安全类:在多线程访问下无需额外同步仍能正确行为。介绍了原子性、竞态条件(如"先检查后执行")、复合操作等概念,详细说明了Java内置锁(synchronized)的互斥语义和可重入特性,强调加锁是保护共享状态的关键手段,同时需在安全性与性能间取得平衡。 **第三章**讨论对象的共享,重点讲述可见性问题。缺少同步时线程可能读取失效数据,非volatile的64位变量甚至可能读到不一致值。加锁不仅保证互斥,还确保可见性;volatile变量提供轻量级可见性保证但不保证原子性。文章还介绍了对象发布与逸出风险、线程封闭技术(Ad-hoc封闭、栈封闭、ThreadLocal)、不可变对象的线程安全特性,以及安全发布的常用模式(静态初始化、volatile/final域、锁保护、线程安全容器)。不同可变性对象有不同的发布要求。 **第四章**讲解对象组合的线程安全性设计方法。通过封装来简化线程安全分析,实例封闭(如Java监视器模式)利用对象内置锁保护内部状态。线程安全性可委托给底层线程安全组件(如ConcurrentHashMap),但若存在跨变量的不变性条件,则需额外加锁。为已有线程安全类添加功能时,优先采用组合而非继承或客户端加锁。同步策略应文档化以辅助维护。 **第五章**介绍Java并发基础构建模块。同步容器(如Vector)存在复合操作和迭代问题;并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)通过分段锁和写时复制提升并发性能。阻塞队列支持生产者-消费者模式和工作密取模式。同步工具类包括闭锁(CountDownLatch)、FutureTask、信号量(Semaphore)和栅栏(CyclicBarrier),用于协调线程执行时序。中断是一种协作机制,处理InterruptedException时应传递或恢复中断状态。最后通过逐步优化Memoizer缓存示例,展示了如何利用ConcurrentHashMap和FutureTask构建高效且可伸缩的结果缓存。 **总结**列出了并发编程的核心原则:减少可变状态、多用final和不可变对象、封装状态与同步机制、用锁保护可变变量、统一锁以维护不变性条件、复合操作期间持有锁、绝不省略同步、将同步策略文档化。
2023-04-04
87
0
0
Java