面向异步机制的自动重构方法研究
2021-01-07纪铭涵齐林张杨董士程李朝帅
纪铭涵 齐林 张杨 董士程 李朝帅
摘 要:為了解决并行处理中同步阻塞会浪费系统资源和影响程序性能的问题,提出了一种基于CompletableFuture异步机制的自动重构方法。首先,使用WALA静态程序分析工具进行访问者模式分析、逃逸分析、别名分析以及数据流分析等静态程序分析技术,确定共享变量数据的操作方式;然后,基于CompletableFuture机制设置4种异步重构模式;最后,根据不同模式实现异步机制的自动重构。基于此方法,在Eclipse平台下开发了自动重构工具AsynRef,并对HSQLDB,Jenkins,JGroups和SPECjbb2005等4个大型实际应用程序进行自动重构,从重构个数、改变的代码行数、准确性和重构后程序性能等方面对AsynRef进行评估,对4个程序所包含的919个同步方法共完成387个异步机制转换。结果显示,使用AsynRef进行异步机制重构后,程序执行性能有8%到39%的不同程度的提升。AsynRef可以有效完成代码异步化自动重构,与传统手动重构相比,有效提升了异步化的重构效率。
关键词:并行处理;同步机制;异步机制;静态程序分析;自动重构
中图分类号:TP311 文献标识码:A
doi:10.7535/hbkd.2021yx05008
收稿日期:2021-06-15;修回日期:2021-09-22;责任编辑:王淑霞
基金项目:国家自然科学基金(61440012);河北省自然科学基金(18960106D);河北省高等学校科学研究计划重点项目(ZD2019093)
第一作者简介:纪铭涵(1997—),女,河北邢台人,硕士研究生,主要从事并发处理、软件自动重构方面的研究。
通讯作者:张 杨副教授。E-mail:zhangyang@hebust.edu.cn
An automated refactoring approach for asynchronous mechanism
JI Minghan,QI Lin,ZHANG Yang,DONG Shicheng,LI Chaoshuai
(School of Information Science and Engineering,Hebei University of Science and Technology,Shijiazhuang,Hebei,050018,China)
Abstract:As synchronous blocking wastes system resources and affects program performance in concurrent processing,an automatic refactoring approach based on the asynchronous mechanism of CompletableFuture was proposed.Firstly,several static analyses by Wala static program analysis tool,such as visitor pattern analysis,alias analysis,and data flow analysis were used in this approach,so that the operation mode of shared variable data was determined.Then four asynchronous refactoring modes were set based on the asynchronous mechanism of CompletableFuture.Finally,the code was refactored according to different modes.An automatic tool AsynRef was implemented by Eclipse and four large-scale practical applications such as HSQLDB,Jenkins,JGroups,and SPECjbb2005 were automatically refactored by AsynRef.AsynRef was evaluated via the number of refactored locks,changed lines of code,accuracy,program performance after refactoring.Among the 919 synchronous methods contained in the four programs,387 asynchronous mechanism conversions were completed.After Asynref was used for asynchronous mechanism refactoring,the program execution performance was improved by 8% to 39%.AsynRef can refactor for aynchronized mechanism effectively.Compared to manual refactoring,the refactoring efficiency is improved significantly.
Keywords:
concurrent processing;synchronization mechanism;asynchronous mechanism;static program analysis;automatic refactoring
随着并发程序设计方法越来越多地被应用于多线程程序开发,为了保证程序的正确性,开发人员通过使用同步机制的方法进行控制,确保了程序正确稳健地运行。然而,由于存在不必要的同步控制,使用粗粒度的同步机制会使得开销更大,从而导致执行效率降低。在Java语言中,同步锁简单易用,在并发程序开发中得到了广泛使用,但由于在使用同步锁修饰整个方法体时会造成粗粒度同步保护的问题,使得程序性能无法得到保证。
使用多线程实现程序并行化是并发程序编程中的主要方式,但是对于临界区的操作与访问会引入数据竞争等并发问题。另外线程个数的设置也是有限制的,因此提高系统性能不能仅通过增加线程数来实现,使用同步机制进行编程方式是阻塞式的,会造成系统资源的浪费。异步机制是达到程序并行执行的另一种方式,所谓异步就是通过将当前任务线程与主应用程序线程分开,达到独立运行的效果。使用异步机制可以有效避免同步机制的阻塞影响,进一步提高程序性能。越来越多的研究着眼于并发程序中的同步机制与异步机制,一些研究使用自动重构工具帮助程序员在多种锁机制之间进行转换,如针对重入锁以及读写锁提出了一种自动重构算法[1],或者面向可定制锁[2]和邮戳锁[3]的自动重构方法,以及在进行优化同步瓶颈的研究中提出的一种锁分解方式[4]。但大多数研究还是仅针对同步机制,缺少对同步机制与异步机制两者间关系以及2种机制之间相互转换的研究,虽然人们已经对并发程序中同步机制有了较深的探索,但并没有考虑到异步机制在并发编程中的作用。
异步机制已经被应用到物联网[5-7]、 WEB应用[8-12]、移动端开发[13-15]和代码重构[16-19]等多个领域。李夏君 [5]对使用异步编程的程序进行分析,结果表明使用异步编程有效提高了云平台的执行速度,并且使用异步编程的方式更加简单。RAVINDRANATH等[6]提出了一组程序分析技术检测异步回调实例,并将这种带有错误优先协议的回调重构为promises,提供异步回调的替代方案。目前,虽然许多学者已经认识到异步机制对并发程序开发的重要性,并且在实际应用中广泛使用了异步编程,但目前缺少对并发程序中异步机制自动重构方法的研究。
针对并行处理中同步阻塞浪费系统资源和影响程序性能的问题,本文提出了一种异步机制的自动重构方法,采用WALA[20]软件分析工具中多种静态程序分析方法,如访问者模式分析、逃逸分析、别名分析、数据流分析等确定进行异步重构的代码,然后获得共享变量数据操作方式,最后基于CompletableFuture机制实现异步重构。基于此方法,在Eclipse平台下设计了一个可以进行异步机制自动重构的插件工具AsynRef,以实现源码级别的重构,帮助开发者完成代码异步化的自动转换。在实验中,对4种大型实际应用程序进行自动重构,从重构个数、改变的代码行数、准确性和重构后程序性能等方面对AsynRef进行评估。
1 同步机制与异步机制性能对比
在Java 1.5中提供了Callable和Future机制,使用这2种机制可以实现异步方式执行程序,但在获取程序执行结果时仍需同步等待获得,因此并不能实现真正意义上的异步。在Java 8中,为了实现真正意义上的异步执行效果,提出了新的Future机制即CompletableFuture机制,不同于原有的Future机制,CompletableFuture实现了在异步任务完成时,通过传入的回调对象,调用回调方法并得到异步执行的结果。
为了说明使用CompletableFuture机制进行异步化程序的可行性,对文件读取与写入的耗时操作进行了同步和異步2种执行方式的性能对比,分别对50,100,300 M文件进行100次读取操作。该段测试程序选自openjdk-jdk 10项目,使用Files.write()和Files.readAllBytes()方法对文件进行读写,通过对这2种方法进行异步方式改写,得到2种执行方式的时间对比。图1是分别使用同步机制和异步机制对3种不同大小文件进行写操作的执行时间对比图,3种不同大小文件使用异步方式的执行时间均少于同步方式的执行时间,并且随着文件的增大,异步方式的优势更加明显。图2是分别使用同步机制和异步机制对100 M文件进行读操作与写操作的执行时间对比图,无论是对于读操作还是写操作,异步方式的执行时间更短。
对比上述文件的读取程序,通过异步机制改进后程序的执行时间较同步方式有所缩短,说明在某些情况下异步机制执行程序提高了程序的性能。
2 异步重构模式
2.1 重构框架
异步重构首先通过静态程序分析方法对并发程序进行分析,然后对可以进行重构的代码通过异步模式进行判断,最后进行相应的异步模式重构。对于一个源程序代码,先提取对应的抽象语法树,再使用访问者模式对抽象语法树中各个节点进行遍历,然后使用多种程序静态分析方法进行程序分析。其中逃逸分析用来分析共享变量动态作用域,别名分析用来解决锁集中的别名问题,数据流分析用来分析共享变量依赖关系。异步模式判断模块根据数据流分析结果进行4种异步重构模式的判断,并选择相应的模式进行重构。重构过程主要是对源程序的抽象语法树进行节点添加、修改等操作,最终将原有的程序执行过程转换为异步执行的过程。面向异步机制的重构框架如图3所示。
2.2 程序静态分析
使用WALA工具对程序进行相应的静态程序分析。首先,通过访问者模式遍历程序中的所有方法,通过WALA分析获得所有变量的访问指令,遍历函数调用图每个节点,得到每个节点下的字段访问指令;其次,使用逃逸分析确定可以进行异步转换的同步方法中的共享变量,利用别名分析去除别名现象对重构的影响;最后,对共享变量进行数据流分析,根据分析结果对异步重构模式进行判断。
2.2.1 逃逸分析
虽然使用同步机制可以保证共享数据的准确性,但由于粗粒度的同步保护开销很大,在并发程序开发过程中存在不必要的同步操作,导致程序的执行效率降低,可通过使用逃逸分析方法进行锁消除达到同步优化的目的[21]。在进行异步机制的自动重构之前,通过逃逸分析确定当前共享变量的使用范围,保证当前共享变量指针的生命周期只在当前线程。
使用WALA收集到所有变量访问操作后,收集所有共享变量accessField访问存入集合VASet中进行逃逸分析。通过收集类中可能存在逃逸现象的字段,定义escapeFields并存入收集到的所有字段,
定义逃逸访问操作集合escapeSet,判断访问操作的访问字段是否在escapeFields中。利用WALA中mayEscape方法对集合escapeSet进行分析,确定是否发生逃逸。使用逃逸分析方法分析共享变量的使用范围,对程序进行锁消除,对于不发生逃逸的共享变量进行异步机制的转换,具体分析过程如图4所示。
2.2.2 别名分析
通过逃逸分析确定可以进行异步机制转换的方法,同时在进行异步代码重构前,需要对共享变量锁监视器对象是否存在别名进行分析。别名分析就是对共享变量进行指针分析,当同一个内存地址被多个共享变量指向时即产生别名,通过别名分析减少由于别名而造成的对分析结果的影响[22]。使用别名分析可以有效避免进行异步重构时,由于共享变量产生别名问题而造成代码重构错误的问题。
在别名分析中,设置MonitorSet为监视器集合,其中monitor_i为监视器对象,监视器monitor_i的指向集为PoniterSet_i。若2个监视器对象的指向集交集不空,则说明2个监视器互为别名,并将其存入别名集aliasSet中,对于没有产生别名问题的锁监视器对象再重构进行实例化,具体分析过程如图5所示。
2.2.3 数据流分析
数据流分析通过对程序中语义信息进行分析,得到程序中数据的变化结果[23]。在进行异步重构时,对共享变量进行数据流分析,确定异步重构的模式。使用控制流图CFG生成程序数据流图DFG,对图中各个节点进行遍历,通过对共享变量进行数据流分析,可以确定对共享变量的操作是单一方法或是多个方法,以及多个方法间是否有依赖关系。对当前的共享变量进行数据流分析,若只涉及一个方法则以字符T存入数据操作序列S中,反之以字符F存入数据操作序列S中,具体分析过程如图6所示。
2.3 基于CompletableFuture的异步模式
根据上述静态分析方法,每个节点返回的数据操作结果可以将异步执行代码分成单个异步执行任务和多个异步执行任务2类,使用CompletableFuture异步机制给出4种异步代码执行的实现模式。
1)模式1 该模式主要针对单个异步执行任务,并且这个任务没有返回值,通过使用Completable-Future类中提供的静态方法runAsync()完成对异步任务的执行。
2)模式2 该模式主要针对单个异步执行任务,并且这个任务有返回值,通过使用CompletableFuture类中提供的静态方法supplyAsync()完成对异步任务的执行。
3)模式3 该模式主要针对多个异步执行任务,当调用方CompletableFuture的计算完成时,通过使用方法whenComplete()执行下一个异步任务。
4)模式4 该模式主要针对多个异步执行任务,并且多个任务间是以串行方式执行,即前一个有返回值的异步任务执行结束后,返回值作为下一个任务的参数。
5)模式4a 前一个有返回值的异步任务执行结束,返回值作为下一个有参数有返回值的异步任务参数,通过使用方法thenApplyAysnc()完成对下一个异步任务的执行。
6)模式4b 前一个有返回值的异步任务执行结束,返回值作为下一个有参数无返回值的异步任务参数,通过使用方法thenAcceptAysnc()完成对下一个异步任务的执行。
2.4 重构算法
在异步机制的自动重构算法中,首先生成当前代码对应的AST树,然后对所有方法节点进行遍历,筛选出所有使用同步的方法,对方法中的共享变量进行别名分析后,根据控制流分析使用相应的异步重构模式进行代码改写,最后将重构后的代码重新添加到AST树上完成重构过程。
使用访问者模式遍历并发程序中同步方法,获取每一个待重构方法Bmethod的锁监视器对象,如果当前方法是同步方法,则使用逃逸分析对共享变量是否逃逸进行分析。具体重构过程如图7所示。对于不发生逃逸现象的共享变量,使用别名分析得到可以进行重构的同步方法锁集合(行3)。接下来利用数据流分析共享变量,从而获得异步重构模式正则匹配字符串str(行4),进行同步机制消除(行6)。在异步模式判断过程中,在一个同步方法中,根据匹配序列对应的共享变量顺序,选择对应的异步重构模式进行代码重构。若当前方法有返回值,并且當前共享变量异步重构模式匹配字符串为T时,则使用异步模式2进行重构(行18—19);若当前方法有返回值,并且当前共享变量异步重构模式匹配字符串为F时,则使用异步模式4a进行重构(行20—21);若当前方法没有返回值,并且当前共享变量异步重构模式匹配字符串为T时,则使用异步模式1进行重构(行9—10);若当前方法没有返回值,并且当前共享变量异步重构模式匹配字符串为F时,若共享变量间有依赖关系,即前一个有返回值的异步任务执行结束,其返回值需要作为下一个异步任务的参数,此时则使用异步模式4b进行重构(行14),如果没有依赖关系则使用异步模式3进行重构(行13)。根据不同的异步模式进行代码重构改写后,最后返回重构后的异步方法Amethod,并更新原代码的AST树完成重构。
2.5 重构工具实现
针对异步机制的自动重构,开发了重构工具AsynRef。该工具利用Eclipse平台进行开发,最终以插件形式实现。通过对重构工具中的基础类进行扩展,实现相关异步模式重构逻辑,得到异步机制自动重构工具,重构界面如图8所示。
3 实验评估
3.1 实验配置
所有实验在惠普Z240工作站上完成。CPU为Intel Core i7-7700 3.60 GHz,有4个处理核,同时支持8线程运行,内存为8 GB,使用Windows 10操作系统,开发环境为Eclipse 4.11,JDK版本为1.8.0_211,程序分析工具WALA的版本为1.52。
3.2 测试程序
使用HSQLDB,Jenkins,JGroups,SPECjbb2005等4个真实程序对AsynRef进行有效性和适用性验证。4种真实程序分别取自不同的应用领域,所含代码行数等也有較大差别。其中HSQLDB是数据库程序,Jenkins是服务器程序,JGroups是群组通讯工具,SPECjbb2005是服务器测试程序。4个程序及配置如表1所示。
3.3 结果及分析
在工具验证阶段,对4个真实程序进行了自动重构,并由多个指标给出验证结果。
1)异步重构个数
首先,选取HSQLDB,Jenkins,JGroups,SPECjbb2005等实际应用程序对提出的方法和工具进行评估。从实验结果可以看出,虽然源程序中有很多使用锁机制的方法,但由于程序执行本身不能进行异步化处理,相较于不同锁机制间的重构转换,异步转换的个数会较少。4种异步模式重构的程序个数如表2所示。
2)重构前后改变的代码行数
使用SLOCCount工具对重构前后程序的代码行数进行统计,可以较为直观地看到自动重构工具减少的工作量,更加直观地反映自动重构工具所带来的优势。
选取的4个应用程序共包含471 218行代码,重构过程增加了4 106行代码,重构后为475 324行代码。由于使用异步方式进行程序执行需要引入较多的代码,所以相较于源程序,虽然可以进行异步重构的个数不多,但是带来的代码行数的改变还是较大的。对于HSQLDB程序来说,异步重构前后改变的代码行数最多,达到2 160行;对于Jenkins,SPECjbb2005和JGroups测试程序,分别增加了1 010,207和729行。
3)重构前后性能对比
对比重构前后程序的各项运行指标,对使用异步机制后的程序进行分析。在HSQLDB程序中提供了基准测试程序,通过改变业务数等参数进行测试。测试结果如图9所示,其中横坐标为处理事务数,分别给出了事务数为100 000到500 000的情况,纵坐标为事务处理率。可以看到在处理事务数为100 000的程序时,使用异步后的程序事务率要远远低于源程序的;在事务数为200 000时,异步后的程序事务率有了提升,但依旧低于源程序;在事务数为300 000时,两者的事务率基本持平;事务数为400 000和500 000时原程序的事务率有了下降,但使用异步的程序事务率要高于源程序。使用异步的程序事务率值呈现上升趋势,说明在处理少量事务的时候,使用异步机制并不能带来性能的提升,但随着事务数不断提高,异步机制的优势逐渐显现,证明在处理更多数据的时候异步机制具有更好的程序性能。
对于Jenkins程序,选取2个单元测试程序对AsynRef工具进行测试,执行时间结果如图10所示。其中对于FunctionsTest程序进行异步重构后,程序的执行时间没有出现明显变化,而使用异步机制运行之后,FielPathTest程序运行时间减少了39%。
对于JGroups选取了4个测试程序进行测试,运行结果如图11所示,其中纵坐标是群组间信息请求处理率。对于RoundTrip,RoundTripRpc,UnicastTest和UnicastTestRpc程序,在使用异步机制进行执行后,请求处理率都有所提升,分别提升了13.5%,12.8%,8%和17%。
图12和图13给出了SPECjbb2005程序在进行异步重构前后的执行结果。图12是随着线程数的改变程序吞吐量变化的情况,由图12可知,使用异步执行程序的吞吐量一直低于源程序的吞吐量,说明使用异步机制并不一定都能提升程序性能。图13给出了在不同线程数执行下,程序运行时堆内存占总内存的比例,可以得知在10种不同的线程数执行情况中,只有2种情况下的堆内存使用比是重构前程序高于重构后程序的,大多数情况下还是采用异步之后的堆内存使用比更高,而在执行线程数为8时,重构前程序的堆内存使用比远远高于重构后程序,说明使用异步机制执行程序在不同情况下对程序的提升程度是不同的。
4)重构的正确性验证
并发程序异步化后,相应的方法不再是同步执行,导致程序的准确性不足以得到保证,虽然在异步重构模式中有针对写操作进行原子操作转换,但还可能存在“ABA”的问题,需要对程序重构前后进行验证。主要对如下2个方面进行正确性验证,一是通过手动检测方式对每一处更改为异步执行的代码进行语法检测,保证程序在执行前不存在错误;二是将白盒测试与黑盒测试相结合,利用设置断点的方式检测重构后各个方法执行过程中数据的准确性,使用黑盒测试检测功能代码,重构前后的输出结果一致。
首先,对异步执行的代码进行语法检测,通过Eclipse编译错误检测以及手工检查每一个测试程序中异步重构的代码,发现每一处都符合所提出的异步重构模式,并且人工检测代码语义都符合重构前的功能。其次,对重构后程序代码的数据正确性进行检测,通过采用白盒测试与黑盒测试相结合的方式,检测到相同输入数据时,异步重构前后方法输出结果一致,且在方法执行过程中方法体内部共享变量数据准确。最终结果表明,并未发现错误,异步重构后的程序可以正确运行。
4 结 语
针对并行处理中同步阻塞会浪费系统资源和影响程序性能的问题,提出了一种面向异步机制的自动重构方法。该方法利用访问者模式分析、逃逸分析、别名分析以及数据流分析等多种程序分析技术,可以将同步代码自动重构为基于CompletableFuture机制的4种异步模式。在实验中通过4个实际应用程序验证了该方法的有效性,利用重构工具完成了287个同步方法、4 106行代码的重构过程,表明该工具可以完成异步机制的自动重构。对比异步重构前后的程序执行时间等指标发现,使用异步机制可以有效提高并发程序的执行效率。但是,由于异步机制本身的复杂性,本文仍存在不足,未来将研究更多的异步重构模式以及适合异步机制执行的应用场景,使用更多的实际应用程序对重构工具进行评估验证。
参考文献/References:
[1] SCHFER M,DOLBY J,SRIDHARANM,et al.Correct refactoring of concurrent java code[C]//.ECOOP 2010-object-oriented Programming.Berlin:Springer-Verlag Berlin Heidelberg,2010:225-249.
[2] ZHANG Y,SHAO S,LIU H,et al.Refactoring java programs for customizable locks based on bytecode transformation[J].IEEE Access,2019,7:66292-66303.
[3] ZHANG Y,DONG S C,ZHANG X Y,et al.Automated refactoring for stampedlock[J].IEEE Access,2019,7:104900-104911.
[4] YU T T,PRADEL M.SyncProf:Detecting,localizing,and optimizing synchronization bottlenecks[C]//Proceedings of the 25th International Symposium on Software Testing and Analysis.New York:Association for Computing Machinery,2016:389-400.
[5] 李夏君.物聯网应用开发运用C#多线程异步编程的研究[J].信息与电脑(理论版),2018(5):162-165.
LI Xiajun.Research on application and development of IoT application using c# multithreaded asynchronous programming[J].China Computer & Communication,2018(5):162-165.
[6] RAVINDRANATH L,NATH S,PADHYE J,et al.Automatic and scalable fault detection for mobile applications[C]//Proceedings of the 12th Annual International Conference on Mobile systems,Applications,and Services.New York:Association for Computing Machinery,2014:190-203.
[7] LIN Y,RADOI C,DIG D.Retrofitting concurrency for android applications through refactoring[C]//Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering.New York:Association for Computing Machinery,2014:341-352.
[8] LIN Y,DIG D.Refactorings for android asynchronous programming[C]//2015 30th IEEE/ACM International Conference on Automated Software Engineering(ASE).Lincoln:IEEE,2015:836-841.
[9] KIM M S,WELLINGS A.Refactoring asynchronous event handling in the real-time specification for java[C]//2009 21st Euromicro Conference on Real-Time Systems.Dublin,Ireland:IEEE,2009:25-34.
[10]HSIAO C H,NARAYANASAMY S,KHAN E M I,et al.AsyncClock:Scalable inference of asynchronous event causality[J].ACM SIGPLAN Notices,2017,52(4):193-205.
[11]JANIN D.An equational modeling of asynchronous concurrent programming[C]//Trends in Functional Programming.Springer,Cham:Springer Nature Switzerland,2020:180-203.
[12]VIEIRA H T,CAIRES L,SECO J C.The conversation calculus:a model of service-oriented computation[C]//Programming Languages and Systems.Berlin:Springer-Verlag Berlin Heidelberg,2008:269-283.
[13]ABADI M,KEIDAR-BARNER S,PIDAN D,et al.Verifying parallel code after refactoring using equivalence checking[J].International Journal of Parallel Programming,2019,47(1):59-73.
[14]KRISHNAN G P,TSANTALIS N.Unification and refactoring of clones[C]//2014 Software Evolution Week- IEEE Conference on Software Maintenance,Reengineering,and Reverse Engineering(CSMR-WCRE).Belgium:IEEE,2014:104-113.
[15]JURNEKA P,HANEK P,BARABAS M,et al.A method for parallel software refactoring for safety standards compliance[C]//8th IET International System Safety Conference incorporating the Cyber Security Conference 2013.Cardiff:IEEE,2013:1-6.
[16]ATKEY R,SANNELLA D.Threadsafe:Static analysis for java concurrency[J].Electronic Communications of the EASST,2015.doi:10.14279/tuj.eceasst.72.1025.
[17]NATH S,LIN F X Z,RAVINDRANATH L,et al.SmartAds:Bringing contextual ads to mobile apps[C]//Proceeding of the 11th Annual International Conference on Mobile systems.New York:Association for Computing Machinery,2013:111-124.
[18]郑雅洁.并行程序中同步机制的软件自动重构方法研究与实现[D].石家庄:河北科技大学,2018.
ZHENG Yajie.Research and Implementation of Software Automatic Refactoring Method for Synchronization Mechanism in Parallel Program[D].Shijiazhuang:Hebei University of Science and Technology,2018.
[19]邵帅.面向细粒度读写锁的自动重构方法研究[D].石家庄:河北科技大学,2020.
SHAO Shuai.An Automated Refactoring Approach for Fine-grained Lock[D].Shijiazhuang:Hebei University of Science and Technology,2020.
[20]IBM T J.Watson Libraries for Analysis(WALA)[EB/OL].[2020-11-20].http://wala.sourceforge.net.
[21]WANG L,SUN X K.Escape analysis for synchronization removal[C]//Proceedings of the 2006 ACM Symposium on Applied Computing.New York:Association for Computing Machinery,2006:1419-1423.
[22]張杨,梁亚楠,张冬雯,等.并发程序中数据竞争检测方法[J].计算机应用,2019,39(1):61-65.
ZHANG Yang,LIANG Yanan,ZHANG Dongwen,et al.Data race detection approach in concurrent programs[J].Journal of Computer Applications,2019,39(1):61-65.
[23]ATHAIYA S,KOMONDOOR R,KUMAR K N.Data flow analysis of asynchronous systems using infinite abstract domains[C]//Programming Languages and Systems.Cham: Springer International Publishing,2021:30-58.