我需要实现一个共识协议(protocol),该协议(protocol)使用带有peek()方法的队列,以表明可以针对任何数量的线程达成共识,即,带有peek()方法的队列具有无限的共识数

这是我的代码

import java.util.LinkedList;
import java.util.Queue;
public class PeekConsensus extends ConsensusProtocol<Integer>
{
    Queue<Integer> queue ;
    public PeekConsensus(int threadCount)
    {
        super(threadCount); //threadCount is a command line argument from the main class specifying the number of threads to handle this process
        queue = new LinkedList<Integer>() //FIFO queue
    }

    public Integer decide(Integer value)
    {
        this.propose(value); // stores "value" in a vector named proposed, at index ThreadID.get()
        int i = ThreadID.get() ;
        queue.add(i)
        System.out.println("Thread " + i + " : " + i) ; // Required by specifications to print thread id and the value added when an item is enqueued
        System.out.println("Thread " + i + " : " + queue.peek()) ; // Required by specifications to print thread id and the value of peek() when when peek() is called
        return proposed.elementAt(queue.peek()) ;

    }
}

根据我的理解,这应该可行,因为如果两个线程返回不同的值,则peek()将必须返回不同的线程ID,并确保了有效性,因为每个线程在插入其线程ID之前都会将其自己的值写入提议中。

有谁能弄清楚我要去哪里哪里,并指导我更正我的代码

最佳答案

该协议(protocol)在我看来还不错。但是您是否考虑过peek()的实现方式?
由于peek()实际上是pop(),然后是push(),因此该代码中的插入可能很差。
假设peek()可以原子执行,则该共识协议(protocol)将起作用。

如何更改它?

只是为了使您的代码运行,您可以将synchronized添加到peek(),但这将破坏共识协议(protocol)的目的,因为线程可能会死而持有锁。

尝试使用AtomicReference。这使您可以原子地获取甚至设置一个值。在这种情况下,指针将为head

现在出现了问题:如何在Java中实现AtomicReference。不幸的是,它是使用CAS实现的,这再次将使仅使用FIFO队列的共识协议(protocol)的目的无法实现。

在最后:正式地,FIFO队列的共识号为2。假设peek()是原子执行的,则您的协议(protocol)有效。但是,正确的实现需要某种CASsynchronized

关于java - 使用FIFO队列和peek()方法实现共识协议(protocol),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32707217/

10-10 08:52