Implemente Peterson Lock en Java

Estoy tratando de implementar el algoritmo de Peterson en Java, y he creado lo siguiente por el momento

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;
    }
}

Obtuve el siguiente código para probar la cerradura ...

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());
    }
}

y aunque espero System.out.println(values.size());imprimirlo 20000, imprimo en cada ejecución números diferentes. ¿Por qué es esto? ¿Qué hice mal?

Respuesta 1

Como señalaron los otros chicos, Java no tiene lectura / escritura volátil en elementos de matriz.

Puede usar AtomicIntegerArraycuál tiene get()y set()con efectos volátiles.

Respuesta: 2

Estoy copiando mi archivo ROOT.war en aplicaciones web de Tomcat 6.0. ¿Hay alguna manera de explotar el archivo al copiarlo? es decir, cuando mi script lo copia en las aplicaciones web ... ¿debería explotar y crear el directorio ROOT? ...

¿Hay una manera fácil de iniciar una función estática (no principal) de una clase con unos pocos clics en Eclipse? Puede hacerlo en la función principal, pero ¿hay otra forma? Por ejemplo, haga clic derecho en una función necesaria en ...

Me gustaría detectar cuándo se detiene mi aplicación (por ejemplo, cuando el usuario presiona el botón de inicio o inicia otra aplicación). Algunas aplicaciones detectan esa situación y muestran una notificación ...

¿Cuál es una manera fácil de obtener la parte integral de una BigFraction como BigInteger? Básicamente quiero el mismo resultado que devuelven los métodos intValue y longValue pero con precisión arbitraria. Yo también ...