Saltar al contenido

Enunciado: Gestión de un Banco con Cajeros Concurrentes

close up photo of programming of codes

Planteamiento

Un banco tiene un sistema para que varios clientes puedan realizar operaciones simultáneamente en distintos cajeros automáticos. Cada cliente puede realizar depósitos o retiros de su cuenta. El sistema debe garantizar que las operaciones sean seguras y que no haya inconsistencias en los saldos de las cuentas, incluso cuando varios clientes acceden a la misma cuenta al mismo tiempo.


Requisitos

  1. Clases necesarias:
    • Una clase CuentaBancaria que represente una cuenta con métodos para depositar y retirar dinero.
    • Una clase Cliente que represente a los hilos que realizan operaciones en las cuentas.
  2. Gestión de operaciones:
    • El sistema debe garantizar que las operaciones sean seguras utilizando sincronización para evitar condiciones de carrera.
    • Si un cliente intenta retirar más dinero del que hay en la cuenta, debe mostrarse un mensaje de error.
  3. Simulación:
    • Simula un sistema con 3 cuentas bancarias y 5 clientes.
    • Cada cliente debe realizar 3 operaciones aleatorias (depósitos o retiros) en una cuenta seleccionada también de forma aleatoria.
  4. Salida esperada:
    • Muestra mensajes indicando qué cliente realiza qué operación, en qué cuenta, y el saldo resultante.

Estructura del Código

import java.util.Random;

class CuentaBancaria {
    private int saldo;

    public CuentaBancaria(int saldoInicial) {
        this.saldo = saldoInicial;
    }

    public synchronized void depositar(int cantidad) {
        saldo += cantidad;
        System.out.println(Thread.currentThread().getName() + " depositó: " + cantidad + " - Saldo actual: " + saldo);
    }

    public synchronized void retirar(int cantidad) {
        if (cantidad <= saldo) {
            saldo -= cantidad;
            System.out.println(Thread.currentThread().getName() + " retiró: " + cantidad + " - Saldo actual: " + saldo);
        } else {
            System.out.println(Thread.currentThread().getName() + " intentó retirar: " + cantidad + " - Saldo insuficiente");
        }
    }
}

class Cliente implements Runnable {
    private final CuentaBancaria[] cuentas;
    private final Random random = new Random();

    public Cliente(CuentaBancaria[] cuentas) {
        this.cuentas = cuentas;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            int cuentaIndex = random.nextInt(cuentas.length);
            CuentaBancaria cuenta = cuentas[cuentaIndex];
            int operacion = random.nextInt(2); // 0 para depósito, 1 para retiro
            int cantidad = random.nextInt(500) + 1; // Operaciones entre 1 y 500

            if (operacion == 0) {
                cuenta.depositar(cantidad);
            } else {
                cuenta.retirar(cantidad);
            }

            try {
                Thread.sleep(1000); // Simula tiempo entre operaciones
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

public class Banco {
    public static void main(String[] args) {
        // Crear 3 cuentas bancarias con saldos iniciales
        CuentaBancaria[] cuentas = {
            new CuentaBancaria(1000),
            new CuentaBancaria(2000),
            new CuentaBancaria(3000)
        };

        // Crear 5 clientes
        for (int i = 1; i <= 5; i++) {
            Thread cliente = new Thread(new Cliente(cuentas), "Cliente-" + i);
            cliente.start();
        }
    }
}

Requisitos de Salida

El programa debe mostrar mensajes como los siguientes:

Cliente-1 depositó: 200 - Saldo actual: 1200
Cliente-2 retiró: 300 - Saldo actual: 1700
Cliente-3 intentó retirar: 4000 - Saldo insuficiente
Cliente-4 depositó: 500 - Saldo actual: 3500
Cliente-5 retiró: 1000 - Saldo actual: 2000

Puntos de Evaluación

  1. Uso correcto de sincronización (synchronized) para garantizar la seguridad de las operaciones.
  2. Simulación realista de concurrencia con múltiples hilos que representan a los clientes.
  3. Validación adecuada para evitar retiros cuando el saldo es insuficiente.
  4. Salida clara y consistente que permita seguir las operaciones realizadas.

Este ejercicio combina los conceptos de concurrencia, sincronización y manejo de recursos compartidos de manera práctica y relevante.

close up photo of programming of codes
Photo by luis gomes on Pexels.com
Etiquetas:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde Tomás González: Formador y Desarrollador Web

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad