4.李雷和韩梅梅拥有共同的银行账户,账户余额为10000元。在同一时刻,李雷在ATM机执行取出5000元的操作,韩梅梅在商场执行消费6000元的操作,为避免出现线程安全问题,请利用线程同步的思想解决。两人在操作前后均需要查询出账户余额,同时需要打印出操作金额。
时间: 2024-11-05 13:28:14 浏览: 6
为了处理李雷和韩梅梅同时操作银行账户的问题,可以采用线程同步机制,比如Java中的synchronized关键字或ReentrantLock等锁机制来保证数据的一致性和完整性。这里我会给出一个简单的示例,展示如何使用`synchronized`关键字来实现:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class BankAccount {
private int balance = 10000;
private Lock lock = new ReentrantLock();
// 获取当前余额方法,并同步锁定
public synchronized int getBalance() {
return balance;
}
// 存取款方法,同样同步锁定
public synchronized void deposit(int amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款操作: " + amount);
} else {
throw new IllegalArgumentException("只接受正数存款");
}
}
public synchronized void withdraw(int amount) {
if (amount <= balance) {
balance -= amount;
System.out.println("取款操作: " + amount);
} else {
throw new IllegalArgumentException("余额不足");
}
}
}
public class AccountOperations {
public static void main(String[] args) {
BankAccount account = new BankAccount();
Thread thread1 = new Thread(() -> {
account.withdraw(5000);
account.getBalance(); // 查询操作后的余额
});
Thread thread2 = new Thread(() -> {
account.deposit(6000);
account.getBalance(); // 查询操作后的余额
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在这个例子中,`getBalance` 和 `deposit` / `withdraw` 方法都被声明为`synchronized`,这意味着在同一时间只有一个线程能够访问它们。这样就确保了在李雷和韩梅梅各自操作期间,不会同时修改账户余额,从而避免了线程安全问题。
阅读全文