用java的多线程写出:某银行卡账号上有500元现金一个人拿着存折去柜台取钱同时另一个人拿着卡去ATM上取钱各自取400元。现要求取钱的过程中不能出现资源竞争:比如400元被取出2次银行的账目不能小于0等。
可以使用Java的多线程来模拟这个场景,可以通过使用锁机制来避免资源竞争。下面是一个可能的实现方式:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BankAccountDemo {
private static final int INITIAL_BALANCE = 500;
private static final int WITHDRAW_AMOUNT = 400;
private static int balance = INITIAL_BALANCE;
private static Lock lock = new ReentrantLock();
public static void main(String[] args) {
Thread person1 = new Thread(new Person("存折"));
Thread person2 = new Thread(new Person("卡"));
person1.start();
person2.start();
}
static class Person implements Runnable {
private String method;
public Person(String method) {
this.method = method;
}
@Override
public void run() {
try {
lock.lock();
if (balance >= WITHDRAW_AMOUNT) {
System.out.println(Thread.currentThread().getName() + "正在使用" + method + "取钱...");
balance -= WITHDRAW_AMOUNT;
System.out.println(Thread.currentThread().getName() + "成功取出" + WITHDRAW_AMOUNT + "元,余额为" + balance + "元");
} else {
System.out.println(Thread.currentThread().getName() + "余额不足,无法取钱");
}
} finally {
lock.unlock();
}
}
}
}
在上述代码中,我们使用了一个balance变量来表示银行账户的余额,并初始化为500元。lock对象是一个可重入锁,用来保护对balance变量的访问。
每个人都是一个独立的线程,通过实现Runnable接口并在run方法中实现取钱的逻辑。在run方法中,首先尝试获取锁,然后检查余额是否足够进行取钱操作。如果足够,就减去取款金额并输出相关信息;如果不足,就输出余额不足的提示信息。
通过使用锁机制,可以确保在取钱过程中不会出现资源竞争问题,即使多个线程同时进行取款操作
原文地址: http://www.cveoy.top/t/topic/hYrF 著作权归作者所有。请勿转载和采集!