模拟线程死锁

synchronized 特点: 两个synchronized 方法,当一个线程已经获取锁定,其它线程就不能再执行 同一实例的synchronized 方法.
synchronized 方法可以执行.

下面开始模拟死锁现象
package com.apq.deadlock;

//餐具类
class Tableware {
	private final String name;
	public Tableware(String name) {
		this.name = name;
	}
	
	public String toString() {
		return " [ " + name + " ] ";
	}

}

class EaterThread extends Thread {
	private String name;
	private final Tableware lefthand;
	private final Tableware righthand;
	
	public EaterThread(String name, Tableware spoon, Tableware fork) {
		this.name = name;
		this.lefthand = spoon;
		this.righthand = fork;
	}
	
	public void run() {
		while (true) {
			this.eat();
		}
	}

	private void eat() {
		synchronized (this.lefthand) {
			System.out.println(this.name + " 左手拿了 " + this.lefthand);
			synchronized (this.righthand) {
				System.out.println(this.name + " 右手拿了 " + this.righthand);
				System.out.println("吃...");
			}
		}
	}

}

public class Main {

	public static void main(String[] args) {
		Tableware spoon = new Tableware("匙子");
		Tableware fork = new Tableware("叉子");
		new EaterThread("apq", spoon, fork).start();
		new EaterThread("bob", fork, spoon).start();
	}

}


结果:
apq抱着匙子不放,bob抱着叉子不放,谁也不能吃了
apq 左手拿了  [ 匙子 ]
apq 右手拿了  [ 叉子 ]
吃...
apq 左手拿了  [ 匙子 ]
bob 左手拿了  [ 叉子 ]

把锁的粒度加大些,可以避免死锁
package com.apq.deadlock;

//餐具类
class Tableware {
	private final String name;
	public Tableware(String name) {
		this.name = name;
	}
	
	public String toString() {
		return " [ " + name + " ] ";
	}

}

class Pair {
	private final Tableware lefthand;
	private final Tableware righthand;
	public Pair(Tableware spoon, Tableware fork) {
		this.lefthand = spoon;
		this.righthand = fork;
	}
	
	public String toString() {
		return "Pair [lefthand=" + lefthand + ", righthand=" + righthand + "]";
	}
}

class EaterThread extends Thread {
	private String name;
	private final Pair pair;
	
	public EaterThread(String name, Pair pair) {
		this.name = name;
		this.pair = pair;
	}
	
	public void run() {
		while (true) {
			this.eat();
		}
	}

	private void eat() {
		synchronized (this.pair) {
			System.out.println(this.name + " 拿了 " + this.pair);
			System.out.println("吃...");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

public class Main1 {

	public static void main(String[] args) {
		Tableware spoon = new Tableware("匙子");
		Tableware fork = new Tableware("叉子");
		Pair pair = new Pair(spoon, fork);
		new EaterThread("apq", pair).start();
		new EaterThread("bob", pair).start();
	}

}




你可能感兴趣的:(thread)