用Java实现Peterson算法

时间:2016-03-28 17:43:52

标签: java multithreading synchronization

我正在学习相互排斥。我试图在Java 中实现Peterson的算法而不使用使用Java的任何同步功能。 (所以,没有volatile / synchronized / etc)。所以,我认为我会使用Peterson的算法,因为我必须使用某种类型的锁步同步。

有两个线程类ConsumerProducer需要交替修改数据。我链接到代码,所以我不要把它全部转储到这里(我没有写它)。

我使用的是小型界面 public interface Buffer

{
   public void set( int value );  // place value into Buffer
   public int get();              // return value from Buffer
}

这是我的代码。我不确定我做错了什么,但它不能正常工作 - 它不同步(互斥不起作用)。

public class SynchronizedBuffer implements Buffer {

    private int buffer = -1; // shared by Producer and Consumer
    private boolean[] claim = new boolean[2];
    private int[] turn = new int[2];

   // place value into buffer
   public void set( int value ){

       turn[0] = 1;
       claim[0]= true;
       while(claim[1] == true && turn[1] == 1);

       try{
                System.err.println( Thread.currentThread().getName() + " writes " + value );
                buffer = value;
           }
       finally{
           claim[0] = false;
           turn[0] = 0;
       }
   }

   // return value from buffer
   public int get(){
       turn[1] = 1;
       claim[1]= true;
       while(claim[0] == true && turn[0] == 1);

       try{
           System.err.println( Thread.currentThread().getName() + " reads " + buffer );         
       }
       finally{
           claim[1] = false;
           turn[1] = 0;
       }

       return buffer; 

   }
}

我已经能够使用volatile关键字轻松解决问题......就像这样:

public class VolatileBuffer implements Buffer {
   private int buffer = -1; // shared by Producer and Consumer
   private volatile boolean flag = false;
   // place value into buffer
   public void set( int value ){
           while(flag == true);
                System.err.println( Thread.currentThread().getName() + " writes " + value );
                flag=true;
                buffer = value;
   }

   // return value from buffer
   public int get(){
       while(flag == false);
          System.err.println( Thread.currentThread().getName() + " reads " + buffer );
          flag=false;
          return buffer; 

   }
   } 

0 个答案:

没有答案