VademécumVademécum\synchronized (palabra reservada)synchronized (palabra reservada)\Ejemplo: cuenta corriente

Como ejemplo, sea esta cuenta absurda que mira el saldo y espera un ratito antes de actualizarlo en cuenta:

class Cuenta

public class Cuenta {

    private volatile int saldo = 0;

 

    public int getSaldo() {

        return saldo;

    }

 

    public int ingresar(int dinero) {

        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) {

        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;

    }

}    

 

Si ponemos a funcionar varios clientes a la vez, tenemos problemas de actualización de la variable “saldo”.

A continuación se presentan dos soluciones, ambas consistentes en convertir la cuenta compartida en un monitor.

principio