java实验银行取款 1.初始化一个账户存入10000元,只有余额大于0元时才能取钱。 2.创建两个线程,使用同一账户取钱。 3.执行多线程取钱操作(每个线程取10000元),查看执行结果
时间: 2024-12-20 07:18:05 浏览: 15
在Java实验中,我们可以使用synchronized关键字来保证银行账户取款操作的安全性,因为同时有多个线程试图从同一个账户取款可能会导致数据竞争(race condition)。下面是一个使用`BankAccount`类和`Thread`类的示例:
首先,我们定义一个`SynchronizedWithdrawThread`类,它代表取款线程:
```java
class SynchronizedWithdrawThread implements Runnable {
private BankAccount account;
public SynchronizedWithdrawThread(BankAccount account) {
this.account = account;
}
@Override
public void run() {
try {
if (account.getBalance() > 0) { // 只有余额大于0时才允许取款
account.withdraw(10000);
System.out.printf("Thread %s withdrew successfully. Balance: %.2f%n", Thread.currentThread().getName(), account.getBalance());
} else {
System.out.println("Thread " + Thread.currentThread().getName() + " cannot withdraw due to insufficient balance.");
}
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}
}
}
```
然后,你可以创建一个`BankAccount`实例,并使用两个线程去尝试取款:
```java
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount(10000); // 初始化账户
SynchronizedWithdrawThread thread1 = new SynchronizedWithdrawThread(account);
SynchronizedWithdrawThread thread2 = new SynchronizedWithdrawThread(account);
Thread t1 = new Thread(thread1, "Thread 1");
Thread t2 = new Thread(thread2, "Thread 2");
t1.start(); // 启动第一个线程
t2.start(); // 同时启动第二个线程
// 等待两个线程结束
t1.join();
t2.join();
// 输出最终账户余额
System.out.println("Final Account Balance: " + account.getBalance());
}
}
```
在这个实验中,由于`withdraw()`方法是`synchronized`的,所以两个线程会交替执行,防止了同时取款导致的异常情况。执行结果会显示每个线程的取款行为以及账户最后的余额。
阅读全文