之前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到不少壁。但总得来讲,有个好的工具老是能事半功倍。我用的工具是eclipse,在开发多线程时,其debug模式是能直接模拟多线程环境的,网上也有许多资料,但大多都不是很全。但愿我可以将本身的一些心得记录下来,但愿能帮助到还为多线程开发而纠结的朋友。html
先写个简单的多线程测试用例:java
package com.wxw.debug;安全
public class TestMain extends Thread {多线程
@Overrideeclipse
public void run() {ide
System.out.println("hello world");工具
}测试
public static void main(String[] args) {.net
TestMain t1 = new TestMain();线程
TestMain t2 = new TestMain();
t1.start();
t2.start();
}
}
这段代码,控制台打印出两行
Hello world
接下来,将示范怎么样使用debug模式进行一步步的执行,后面将逐步对知识进行应用扩展
这里有个点须要注意,断点的位置必定要正确,run方法或者run之后调用的方法里,不然的话,程序跑完了,debug模式里也只有一个主线程在跑,好了,直接看结果。
在这里咱们看到了两个线程已经起来了,在debug模式里也注明了Thread-0和Thread-1,在这里我再加段代码来更明显的显示哪一个线程执行到了这里。
加上这段代码后,打印出来的结果就是
Thread-0 hello world
Thread-1 hello world
如今我须要将Thread-1这个线程先打印出来结果,也就是将线程可控,我想先执行哪一个都行,怎么办了?为了更加明显,我多加几个线程,总共5个线程,按前后顺序打印出来,我是语言表达困难户,直接看图,图为动态,有点大,请耐心等待
我想这个动态应该不用多解释,也许有人会问这有什么用,这个用处可大了,咱们能够控制哪一个线程开始运行,哪一个线程运行到某个点后,程序暂停在那里,而后其余程序再运行。最典型的例子就是单例模式在多线程下是否绝对安全(是否必定是单例),这里我也演示一下,线程不安全的单例模式代码,摘自:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
System.out.println(instance);
instance = new Singleton();
}
return instance;
}
}
是不是单例,打印出引用地址就能够了,测试环境用两个线程打印
正常状况下,应该打印出来两个一样的值,先直接run,不用debug模式,结果以下:
这通常状况下,是表现的单例,在大多数状况下,你有可能测试不少次的结果依然如此,但这段代码确实在多线程状况下会出问题,怎么才能重现这个问题了,下面直接用图演示:
最后的结果:
com.wxw.debug.Singleton@1fc0f04
com.wxw.debug.Singleton@13ded59
这里能够看出,两个结果不同,证实不是同一个对象。问题就这样重现,是否是以为这个工具颇有用啊。
这篇文章不是讲单例模式,举的是一个典型的例子,主要讲用debug模式解决多线程状况下的问题。我想,用debug模式,不单单用来解决问题,还能帮助咱们理解一些知识点,这才达到了边用边学的好处。