Je suis en train de mettre en œuvre Peterson's algorithm en Java, et ont créé ce qui suit pour le momentMettre en œuvre Peterson Lock dans Java
public class Peterson {
private volatile boolean[] flag = new boolean[2];
private volatile int victim;
public void lock(int id)
{
//System.out.println(id);
int i = id;
int j = 1 - id;
flag[i] = true;
victim = i;
while (flag[j] && victim == i) {};
}
public void unlock(int id)
{
flag[id] = false;
}
}
Je suis le code suivant pour tester la serrure ...
class Counter {
private int value;
public Counter(int c) {
value = c;
}
public int get()
{
return value;
}
public int getAndIncrement() {
return value++;
}
}
class Thread1 implements Runnable {
private Counter c;
private int id;
private List<Integer> values;
private Peterson lock;
public Thread1(Counter c, int id, List<Integer> values, Peterson l) {
this.c = c;
this.id = id;
this.values = values;
this.lock = l;
}
public void run() {
while (true)
{
lock.lock(id);
try {
try {
if (c.get() > 20000)
return;
int n = c.getAndIncrement();
values.add(n);
} catch (Exception e) {
e.printStackTrace();
}
}
finally {
lock.unlock(id);
}
}
}
}
public class Tmp {
public static void main(String[] args) throws IOException {
Counter c = new Counter(1);
Thread[] t = new Thread[2];
List<Integer> values = new ArrayList<Integer>();
Peterson l = new Peterson();
for (int i = 0; i < t.length; ++i) {
t[i] = new Thread(new Thread1(c, i, values, l));
t[i].start();
}
System.out.println(values.size());
}
}
et même si je m'attends à System.out.println(values.size());
pour imprimer 20000
Il imprime sur chaque course des numéros différents. Pourquoi est-ce? Qu'ai-je fait de mal?
Je ne comprends pas ce que vous entendez par 'barr', je devrais définir 'barr = true' dans' unlock ', qu'en est-il de la méthode 'lock'? –
@mario vous voulez que des actions avant le déblocage * se produisent avant * des actions consécutives à un verrouillage réussi, il vous suffit donc de lire 'barr' en lock (le * arrive avant * avec' volatile's ne sont garantis que sur le même champ) –
Apparemment, j'ai eu des résultats erronés à cause de 'joing'. Je vous remercie :) –