Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程的“假死”。

package unit2;

public class Demo11_Run {
	public static void main(String[] args) {
		try {
			DealThread t1 = new DealThread();
			t1.setFlag("a");
			Thread thread1 = new Thread(t1);
			thread1.start();
			Thread.sleep(100);
			t1.setFlag("b");
			Thread thread2 = new Thread(t1);
			thread2.start();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class DealThread implements Runnable {
	public String username;
	public Object lock1 = new Object();
	public Object lock2 = new Object();
	public void setFlag(String username) {
		this.username = username;
	}

	public void run() {
		if (username.equals("a")) {
			synchronized (lock1) {
				try {
					System.out.println("username = " + username);
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				synchronized (lock2) {
					System.out.println("按lock1->lock2代码顺序执行了 ");
				}
			}
		}
		if (username.equals("b")) {
			synchronized (lock2) {
				try {
					System.out.println("username = " + username);
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (lock1) {
					System.out.println("按lock2->lock1代码 顺序执行了 ");
				}
			}
		}
	}
}

Java多线程12:多线程的死锁-LMLPHP
使用JDK自带的工具监测是否有死锁的现象。首先进入CMD工具,再进入JDK的安装文件夹中的bin目录,执行jps命令:
Java多线程12:多线程的死锁-LMLPHP
得到线程Demo11_Run的id值是2228。再执行jstack命令:
Java多线程12:多线程的死锁-LMLPHP
Java多线程12:多线程的死锁-LMLPHP

10-05 12:17