⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 一个简单的Java并发系统动态测试工具
💻 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 + -