📄 readme.txt
字号:
=====================================================================
contest ver 1.0
一个简单的并发系统动态测试工具
Copyright (C) 2003, 2004 王咏刚
http://www.contextfree.net/wangyg
=====================================================================
contest是用Java语言编写的一个简单的多线程同步工具,我们可以使用这个工具,对多线程的Java系统进行动态测试。一般说来,多线程系统的执行序列是不确定的,即便多线程系统包含死锁(Deadlock)、竞态条件(Race Condition)等Bug,在一般的单CPU计算机上测试运行,Bug也并不容易表现出来。如果我们能在线程代码中的特定位置插入同步点,控制多线程系统的执行序列,就有可能捕捉到Bug。这就是contest工具的基本工作原理了。
例如,在下面的Java程序中,线程t1和t2可能会发生死锁:
public class DeadLockTest
{
public static Object a = new Object();
public static Object b = new Object();
public static void main(String[] args)
{
try
{
DeadLock1 t1 = new DeadLock1();
DeadLock2 t2 = new DeadLock2();
t1.start();
t2.start();
t1.join();
t2.join();
}
catch(Exception e) {}
}
}
class DeadLock1 extends Thread
{
public void run()
{
synchronized(DeadLockTest.a)
{
synchronized(DeadLockTest.b)
{
}
}
}
}
class DeadLock2 extends Thread
{
public void run()
{
synchronized(DeadLockTest.b)
{
synchronized(DeadLockTest.a)
{
}
}
}
}
但当我们在单CPU计算机上测试上述代码时,因为两个线程先后执行,很难发现死锁的情况,程序大多都正常结束了。如果我们利用contest工具提供的功能,在main()函数中,先通过TestManager的getInstance()方法获得TestManager的惟一对象实例,然后使用addThread()方法添加线程t1和t2,使用addEvent()添加事件“Event1”,并设定该事件在1秒后激活。同时,我们在线程代码中使用TestManager的waitFor()方法为两个线程加入同步点,让两个线程都在同样的位置等待事件“Event1”,然后在继续执行。这样,上述程序代码被修改为:
import contest.*;
public class DeadLockTest
{
public static Object a = new Object();
public static Object b = new Object();
public static void main(String[] args)
{
DeadLock1 t1 = new DeadLock1();
DeadLock2 t2 = new DeadLock2();
TestManager test = TestManager.getInstance();
test.addThread(t1, "Thread1");
test.addThread(t2, "Thread2");
test.addEvent("Event1", 1000);
test.start();
}
}
class DeadLock1 extends Thread
{
public void run()
{
synchronized(DeadLockTest.a)
{
TestManager.waitFor("Event1");
synchronized(DeadLockTest.b)
{
}
}
}
}
class DeadLock2 extends Thread
{
public void run()
{
synchronized(DeadLockTest.b)
{
TestManager.waitFor("Event1");
synchronized(DeadLockTest.a)
{
}
}
}
}
再次编译运行DeadLockTest,我们会发现,程序进入了死锁状态,不能正常退出了。在contest的samples目录下可以找到DeadLockTest.java程序的源代码。
对于竞态条件Bug,contest也能完成简单的测试功能。在contest的samples目录下,有一个名为PoolTest.java的程序,演示了这种测试方法,详情请见PoolTest.java的源代码。
此外,TestManager类还通过conditionalWaitFor()方法提供了条件等待功能,即当一个线程类有多个线程实例运行时,我们可以利用此方法,指定某个特定的线程实例等待某个特定的同步事件,而不是所有线程实例都等待同一个同步事件,这可以更精确地控制线程的执行序列。有关TestManager类的更详细的使用方法,请参见TestManager.java源代码。
contest虽然是使用Java语言实现的,但其源代码十分简单,使用C语言或C++语言实现类似的功能也是非常容易的事情。
王咏刚
2004.1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -