您的位置:首页 > 编程语言 > Python开发

Python统计列表中的重复项出现的次数(伪原创)

2011-09-01 15:43 591 查看
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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: