Java中的Peterson算法?

时间:2010-05-26 10:06:41

标签: java algorithm concurrency thread-safety memory-model

是否有用于Java中互斥的Peterson算法的示例实现?

5 个答案:

答案 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 *类使用无锁,繁忙循环的方法来更新共享数据。它们可能符合您的要求。