李雷和韩梅梅拥有共同的银行账户,账户余额为10000元。在同一时刻,李雷在ATM机执行取出5000元的操作,韩梅梅在商场执行消费6000元的操作,为避免出现线程安全问题,请利用线程同步的思想解决。两人在操作前后均需要查询出账户余额,同时需要打印出操作金额。使用Java
时间: 2024-10-23 12:02:11 浏览: 18
在Java中处理李雷和韩梅梅的银行账户操作,防止线程安全问题是通过使用synchronized关键字或者Lock接口来实现的。这里我们可以创建一个BankAccount类,包含一个共享的balance字段以及对应的deposit、withdraw和checkBalance方法。为了保证操作顺序并确保数据一致性,可以将读取和修改余额的操作都加锁。
```java
public class BankAccount {
private int balance;
private Object lock = new Object(); // 使用对象作为锁
public BankAccount(int initialBalance) {
this.balance = initialBalance;
}
synchronized public void deposit(int amount) {
balance += amount;
System.out.println("Deposit: " + amount);
}
synchronized public void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("Withdraw: " + amount);
} else {
throw new InsufficientFundsException();
}
}
synchronized public int checkBalance() {
return balance;
}
public static void main(String[] args) {
BankAccount account = new BankAccount(10000);
// 创建两个线程
Thread thread1 = new Thread(() -> {
account.withdraw(5000);
System.out.println("Checking balance after withdrawal: " + account.checkBalance());
});
Thread thread2 = new Thread(() -> {
try {
account.deposit(6000);
} catch (InsufficientFundsException e) {
System.out.println("Not enough funds for deposit.");
}
System.out.println("Checking balance after deposit: " + account.checkBalance());
});
// 启动线程并等待完成
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
class InsufficientFundsException extends Exception {
// 自定义异常
}
```
在这个例子中,`synchronized`关键字用于确保对balance字段的访问是互斥的,即同一时间只有一个线程可以进行存款、取款或查看余额的操作。当李雷试图取款和韩梅梅尝试存款同时进行时,他们的操作会被按照提交的顺序执行,从而避免了并发问题。
阅读全文