限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410

先来写一段死锁的程序:

package test;
/**
 * @author test
 */
public class JStackDemo {
	public static void main(String[] args) {
		Thread t1 = new Thread(new DeadLockclass(true));//建立一个线程
		Thread t2 = new Thread(new DeadLockclass(false));//建立另一个线程
		t1.start();//启动一个线程
		t2.start();//启动另一个线程
	}
}
class DeadLockclass implements Runnable {
	public boolean flag;// 控制线程
	DeadLockclass(boolean flag) {
		this.flag = flag;
	}
	public void run() {
	
		// 如果flag的值为true则调用t1线程
		if (flag) {
			while (true) {
				synchronized (Suo.o1) {
					System.out.println("o1 " + Thread.currentThread().getName();
					synchronized (Suo.o2) {
						System.out.println("o2 " + Thread.currentThread().getName();
					}
				}
			}
		}
		// 如果flag的值为false则调用t2线程
		else {
			 while (true) {
				synchronized (Suo.o2) {
					System.out.println("o2 " + Thread.currentThread().getName();
					synchronized (Suo.o1) {
						System.out.println("o1 " + Thread.currentThread().getName();
					}
				}
			}
		}
	}
}
class Suo {
	static Object o1 = new Object();
	static Object o2 = new Object();
}

当我启动该程序时,我们看一下控制台:

我们发现线程死锁,程序只输出了两行内容,然后程序就不再打印其它的东西了,但是程序并没有停止。 这样就产生了死锁。 当线程1使用锁住了o1的同时,线程2也是用锁住 了o2。当两个线程都执行完第一个打印任务的时候线程死锁,线程1想锁住o2,线程2想锁住o1。但是,线 程1当前锁着o1,线程2锁着o2。所以两个想成都无法继续执行下去,就造成了死锁。

然后,我们使用来看一下线程堆栈信息: [ ] pid

线程死锁_线程死锁的原因_线程死锁是什么

堆栈写的很明显,它告诉我们 Found one Java-level ,然后指出造成死锁的两个 线程的内容。然后,又通过 Java stack for the above来显示更详细的 死锁的信息。

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410