我正在学习相互排斥。我试图在Java 中实现Peterson的算法而不使用使用Java的任何同步功能。 (所以,没有volatile / synchronized / etc)。所以,我认为我会使用Peterson的算法,因为我必须使用某种类型的锁步同步。
有两个线程类Consumer和Producer需要交替修改数据。我链接到代码,所以我不要把它全部转储到这里(我没有写它)。
我使用的是小型界面 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;
}
}