论文部分内容阅读
随着软件系统的日益复杂,代码量越来越大。目前,Java多线程的同步保护需要程序员手动完成,这样不仅加重了程序员的负担,而且难以实现读写互斥。此外,对方法调用顺序的运行时刻验证与监控也需要特殊的工具才能完成。对于程序进行并发控制和运行时跟踪/监控的需求日益迫切。目前有很多工具可以对程序进行动态验证,针对某些性质实现了运行时跟踪与监控。但是,大多数工具的使用方法比较复杂,且没有提供多线程并发程序的保护支持。
为此,我们参考目前流行的一些技术与框架采用的方法,采用AOP的思想,并结合现有的程序分析技术,提出利用Java的annotation和反射机制来实现运行时刻监控和保护。这个方法具有简单易学的优点。基本思想如下:
1.程序员以Java的annotation的方式声明设计意图,并在类的设计阶段将此设计意图加入到类的定义中;除此之外,程序员还需要提供一个工厂方法,类的使用者通过此工厂方法创建的对象将会受到运行时的监控;
2.类的使用者在使用类时,应该通过程序员提供的工厂方法来创建对象实例。通过Java的反射机制可以获取annotation表示的设计意图,因此对象实例在运行时便可以受到跟踪与监控,从而使程序可以对各种操作行为进行保护及限制,以此来实现程序员的设计意图。
我们根据上述思想解决了多线程程序的并发保护和对象调用顺序的运行时刻监控问题。
在多线程并发保护问题时,程序员用@write和@read来分别修饰类中的写方法(会改变对象的状态)和读方法(不会改变对象的状态)。用户在被监控的对象上调用方法时,监控模块通过反射机制获取到这些annotation,然后根据是读方法还是写方法采取不同的保护行为。这个方法不仅可以帮助程序员自动实现多线程的读写互斥,还可以限制同时调用读方法的线程数量。
对于方法调用顺序的监控,我们的解决方法如下:程序员用annotation的方式,以正则表达式的形式修饰类的定义,以此来规定该类的方法被调用的约束。在监控某个对象时,我们通过反射机制获取到相应的annotation,并根据该正则表达式自动构造一个DFA,通过模拟DFA的状态转换来判断用户的调用行为是否合法,以此来实现对用户的调用行为的运行时刻监控。