VademécumVademécum\Zonas de exclusión mutua (concepto)Zonas de exclusión mutua (concepto)\Ejemplo

Como ejemplo usaremos un contador compartido. Si este código se ejecuta con control, tendremos que un thread recoge el valor y antes de devolverlo modificado, otro thread se lo lleva y el resultado es un desastre.

class ContadorCompartido

public class ContadorCompartido {

      private int n = 0;

 

      public int getN(String id) {

            return n;

      }

 

      public void setN(String id, int n) {

            this.n = n;

            System.err.println(id + ": " + n);

      }

}

class IncrementadorLento

public class IncrementadorLento extends Thread {

      private String id;

      private ContadorCompartido cc;

 

      public IncrementadorLento(String id, ContadorCompartido cc) {

            this.id = id;

            this.cc = cc;

      }

 

      @Override

      public void run() {

            try {

                  int valor = cc.getN(id);

                  valor++;

                  sleep(1000);

                  cc.setN(id, valor);

            } catch (InterruptedException e) {

                  System.err.println(e);

            }

      }

}

 

principio