模擬線程死鎖

[b][color=blue]synchronized 特點[/color]:[/b] 兩個synchronized 方法,當一個線程已經獲取鎖定,其它線程就不能再執行[color=red][b]同一實例[/b][/color]的synchronized 方法.
[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();
}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章