VademécumVademécum\synchronized (palabra reservada)synchronized (palabra reservada)\Ejemplo: cuenta corrienteEjemplo: cuenta corriente\Solución con zonas de exclusión mutua

Solución con zonas de exclusión mutua

Para controlar la actualización de la variable “saldo” podemos establecer una zona de exclusión mutua usando cualquier objeto. En el código que sigue se han establecido 2 zonas de exclusión, usando ambas el mismo objeto de control, de forma que la exclusión abarca ambas zonas:

class Cuenta modificada

public class Cuenta {

    private volatile int saldo = 0;

    private final Object zona = new Object();

 

    public int getSaldo() {

        synchronized (zona) {

            return saldo;

        }

    }

 

    public int ingresar(int dinero) {

        synchronized (zona) {

            try {

                int x = saldo + dinero;

                int s = (int) (Math.random() * 2000);

                Thread.sleep(s);

                saldo = x;

            } catch (InterruptedException e) {

                System.err.println(e);

            }

            return saldo;

        }

    }

 

    public int sacar(int dinero) {

        synchronized (zona) {

            try {

                int x = saldo - dinero;

                int s = (int) (Math.random() * 2000);

                Thread.sleep(s);

                saldo = x;

            } catch (InterruptedException e) {

                System.err.println(e);

            }

            return saldo;

        }

    }

}

 

principio