模拟线程死锁

[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();
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值