是否有用于Java中互斥的Peterson算法的示例实现?
答案 0 :(得分:27)
答案 1 :(得分:5)
除非你对Peterson的算法有一些特殊的需要(在使用像Java这样的高级语言时会很奇怪),我建议你看看内置语言的同步设施。
例如,您可能会在本书的章节中找到“种族条件和 相互排斥“在Java中很有用:http://java.sun.com/developer/Books/performance2/chap3.pdf
特别是:
Java提供内置支持 正在等待这种“国家变化” 条件的概念。一个条件 然而,有点用词不当 因为这完全取决于用户 是否确实是一个条件 发生了。此外,一个条件 不一定要特别真实或 假。要使用条件,必须 熟悉三个关键方法 对象类:
•wait():这个 方法用于等待条件。 当锁定时调用它 为特定(共享)举行 对象
•notify():此方法是 用于通知单个线程a 条件已经(可能)改变了。 同样,当a时调用此方法 锁定目前正在举行 特别的对象。只有一个 线程可以被唤醒 这个电话。
•notifyAll():此方法 用于通知多个线程 条件有(可能) 改变。正在运行的所有线程 在这个方法被调用时 收到通知。
答案 2 :(得分:4)
我自己在网上找不到一个,所以我决定尝试写一下:
public class Peterson implements Runnable {
private static boolean[] in = { false, false };
private static volatile int turn = -1;
public static void main(String[] args) {
new Thread(new Peterson(0), "Thread - 0").start();
new Thread(new Peterson(1), "Thread - 1").start();
}
private final int id;
public Peterson(int i) {
id = i;
}
private int other() {
return id == 0 ? 1 : 0;
}
@Override
public void run() {
in[id] = true;
turn = other();
while (in[other()] && turn == other()) {
System.out.println("[" + id + "] - Waiting...");
}
System.out.println("[" + id + "] - Working ("
+ ((!in[other()]) ? "other done" : "my turn") + ")");
in[id] = false;
}
}
欢迎发表评论,我们将不胜感激:)
答案 3 :(得分:3)
你应该看看“多处理器编程的艺术”一书。他非常详细地介绍了不同的锁实现(旋转和阻塞)。他还介绍了不同类型的并发算法(例如跳过列表)。以下是他关于Peterson Lock算法的书中的一个片段
Class Peterson implements Lock{
private final boolean []flag = new boolean[2];
private volatile int victim;
public void lock(){
int i = ThreadID.get(); // ThreadID is a ThreadLocal field
int j= 1 - i;
flag[i] = true; // I'm Interested
victim = i; // You go first
while(flag[j] && victim == i){}; //wait
}
public void unlock(){
int i = ThreadID.get();
flag[i] = false; //Not interested anymore
}
}
答案 4 :(得分:0)
虽然不是专利算法,但AtomicBoolean和Atomic *类使用无锁,繁忙循环的方法来更新共享数据。它们可能符合您的要求。