构造几个死锁的例子(Java )

构造几个死锁的例子(Java )

1

public class Deadlock {
	public static void main(String[] args) {
		final A a1 = new A("a1");
		final A a2 = new A("a2");
		a1.setA(a2);
		a2.setA(a1);
		Thread t1 = new Thread(()->{
			a1.method1();
		});
		Thread t2 = new Thread(()->{
			a2.method1();
		});
		t1.start();
		t2.start();
	}
}
class A {
	String name;
	A a;
	public A(String name) {
		this.name = name;
	}
	public void setA(A a) {
		this.a = a;
	}
	synchronized void method1() {
		System.out.println(Thread.currentThread().getName() + ": 锁住了" + name);
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": 我在等待" + a.name);
		a.method2();
	}
	synchronized void method2() {
		System.out.println(Thread.currentThread().getName() + ": 我得到了" + name);
		System.out.println(Thread.currentThread().getName() + ": " + name + "." + a.name + ".method2()");
	}
}

运行结果:

2

public class Deadlock {
	public static void main(String[] args) {

		Thread t1 = new Thread(()->{
			A.method1();
		});
		Thread t2 = new Thread(()->{
			B.method1();
		});
		t1.start();
		t2.start();
	}
}
class A {
	synchronized static void method1() {
		System.out.println(Thread.currentThread().getName() + ": 锁住了" + A.class);
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": 我在等待" + B.class);
		B.method2();
	}
	synchronized static void method2() {
		System.out.println(Thread.currentThread().getName() + ": 获得了" + A.class);
		System.out.println(Thread.currentThread().getName() + ": " + A.class + ".method2");
	}
}
class B {
	synchronized static void method1() {
		System.out.println(Thread.currentThread().getName() + ": 锁住了" + B.class);
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": 我在等待" + A.class);
		A.method2();
	}
	synchronized static void method2() {
		System.out.println(Thread.currentThread().getName() + ": 获得了" + B.class);
		System.out.println(Thread.currentThread().getName() + ": " + B.class + ".method2");
	}
}

运行结果:

3

public class Deadlock {
	public static void main(String[] args) {
		final String lock1 = "lock1";
		final String lock2 = "lock2";
		Thread t1 = new Thread(()->{
			synchronized (lock1) {
				System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock1);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + ": 在等待" + lock2);
				synchronized (lock2) {
					System.out.println(Thread.currentThread().getName() + ": 获得了" + lock2);
				}
			}
		});
		Thread t2 = new Thread(()->{
			synchronized (lock2) {
				System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock2);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + ": 在等待" + lock1);
				synchronized (lock1) {
					System.out.println(Thread.currentThread().getName() + ": 获得了" + lock1);
				}
			}
		});
		t1.start();
		t2.start();
	}
}

运行结果:

posted @ 2019-08-26 23:42  lovexy-fun  阅读(286)  评论(0)    收藏  举报