Java代码测试线程死锁 用jvisualvm监控

本文通过一个简单的Java示例展示了如何在线程间产生死锁。通过使用synchronized关键字锁定不同的对象资源,在特定的情况下会导致线程无法继续执行。文章还介绍了如何使用JDK自带的jvisualvm工具来检测和分析线程状态,帮助开发者定位并解决死锁问题。

测试线程死锁,运行以下代码:

public class Test1 {
	private static Object o1 = new Object();
	private static Object o2 = new Object();
	public static void main(String[] args) {
		for( int i = 0;i<100;i++){
			new Thread(new Runnable() {
				@Override
				public void run() {
					synchronized (o1) {
						synchronized (o2) {
							System.out.println("am o1");
						}
					}
				}
			}).start();
			new Thread(new Runnable() {
				@Override
				public void run() {
					synchronized (o2) {
						synchronized (o1) {
							System.out.println("am o2");
						}
					}
				}
			}).start();
		}
	}
}
  代码中线程1先申请obj1,再申请obj2;线程2先申请obj2,再申请obj1。如果执行次数多了就会出现死锁,我们依然来看线程的监控台: 
在jdk中 C:\Program Files\Java\jdk1.8.0_101\bin目录下有jvisualvm.exe工具

运行以上代码 查看线程,如下图所示:

选择一个线程进行dump查看;可以查看出死锁的具体原因,可利用此工具查看程序中那些线程死锁,从而更好的排查错误。