关键词:
Java并发程序
并发错误基准程序集
锁检测
并发错误重现
摘要:
在现代软件开发实践中,并发编程随着计算机硬件CPU内核数的不断增长而蓬勃发展。最近一项针对2227个实际Java开源项目的研究发现其中75%的项目都涉及到并发。但是由于多线程执行的不确定性和复杂性,并发编程也引入了如数据竞用、死锁、原子性违例等并发错误,而这些并发错误往往难以被发现和重现,降低了并发程序的质量。研究者提出了多种并发错误的检测和重现技术,但是由于存在以下两方面的问题,相关研究成果并没有被广泛应用于开发实践中:(一)缺乏源于实践的并发错误基准程序集。现有的基准程序集或者不是为并发错误检测设计的,缺乏专业性;或者其中的错误程序并非来自开发实践的实际错误而是由研究人员设计的人造错误,缺乏对实际问题的代表性,无法反映实际并发错误的复杂性,因此这些基准程序集难以评估各个研究解决实际问题的能力,难以作为比较研究成果的基准。(二)研究的对象范围有限,没有完全覆盖实际应用场景。现代软件开发对第三方代码的依赖日益增多,在开发人员自身的代码(本论文称为第一方代码)同第三方代码的交互中亦会产生并发错误,但目前的并发错误检测和重现研究仍然主要关注于第一方代码,因此难以应对相关的实际问题。为解决上述问题,本论文提出了面向实践的Java并发错误检测和重现技术,贯穿了并发错误的发生、检测和重现的全部过程。本论文以源于开发实践的实际并发错误为出发点,建立包含了来自8个开源项目的47个并发错误的并发错误基准程序集Ja Con Te Be作为面向实践的研究基础。通过对实际并发错误的分析研究,提出检测并发程序中的隐式锁的技术Lock Peeker,以发现闭源第三方代码中的死锁。最后提出了Java并发错误的细粒度重现方法SPDebugger,以支持更加复杂的实际调度场景的错误。实验结果表明,(一)在并发错误基准程序集的问题上,Ja Con Te Be可以有效地评估现有Java并发错误检测方法的优势和缺点。(二)在应对研究对象范围有限的问题上,Lock Peeker有效扩展了死锁检测方面的局限,可以成功发现74.9%的隐式锁,并且能够与传统的死锁检测工具集成,检测到它们先前所不能发现的实际死锁错误;SPDebugger有效扩展了并发错误重现方面的局限,在几乎没有增加开发者工作量的前提下可以确定性地重现出更多的实际并发调度。