模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。账户的初始余额是 20000 元,两个线程每次存储 1000 元,分别各存储20000 元,不允许出现错误数据。
时间: 2024-10-23 17:05:35 浏览: 49
模拟一个简单的银行系统,我们可以使用Java的`synchronized`关键字来确保两个线程对账户的操作互斥,避免数据竞争。首先,我们定义一个Account类代表银行账户,它有一个balance字段表示当前余额,然后有两个方法,deposit方法用于存款:
```java
import java.util.concurrent.atomic.AtomicInteger;
class Account {
private AtomicInteger balance = new AtomicInteger(20000); // 初始余额
private Object lock = new Object(); // 锁对象
public synchronized void deposit(int amount) {
if (amount == 1000 && balance.addAndGet(amount) <= 40000) { // 存款金额检查,保证不超过初始余额加上20000元
System.out.printf("线程正在存款 %d, 新余额: %d%n", amount, balance.get());
} else {
System.out.println("存款失败,超出余额限制!");
}
}
}
public class BankSystem {
public static void main(String[] args) {
Account account = new Account();
Thread t1 = new Thread(() -> {
account.deposit(1000);
account.deposit(1000);
});
Thread t2 = new Thread(() -> {
account.deposit(1000);
account.deposit(1000);
});
t1.start();
t2.start();
try {
t1.join();
t2.join(); // 等待两个线程结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在这个例子中,`synchronized`关键字确保了同时只有一个线程可以进入`deposit`方法,防止了数据冲突。每个线程只存款两次,总共20000元,不会超过账户的初始余额。
阅读全文