[b][color=red]非[/color][/b]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();
}
}
[size=medium]結果:[/size]
apq抱着匙子不放,bob抱着叉子不放,誰也不能吃了
apq 左手拿了 [ 匙子 ]
apq 右手拿了 [ 叉子 ]
喫...
apq 左手拿了 [ 匙子 ]
bob 左手拿了 [ 叉子 ]
[size=medium]把鎖的粒度加大些,可以避免死鎖[/size]
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();
}
}