在java中,李雷和韩梅梅拥有共同的银行账户,账户余额为10000元。在同一时刻,李雷在ATM机执行取出5000元的操作,韩梅梅在商场执行消费6000元的操作,为避免出现线程安全问题,请利用线程同步的
时间: 2024-11-05 11:29:32 浏览: 21
李雷和韩梅梅的故事.zip
在 Java 中,为了确保李雷和韩梅梅同时操作银行账户余额时不会导致数据不一致,可以使用 `synchronized` 关键字或者 `java.util.concurrent.locks.Lock` 接口来实现线程同步。这里以简单的 `synchronized` 为例来说明:
```java
public class BankAccount {
private int balance = 10000; // 账户余额
public synchronized void withdraw(int amount) {
if (amount <= balance) {
balance -= amount;
System.out.println("李雷取出了 " + amount + " 元,当前余额:" + balance);
} else {
System.out.println("余额不足");
}
}
public synchronized void spend(int amount) {
if (amount <= balance) {
balance -= amount;
System.out.println("韩梅梅消费了 " + amount + " 元,当前余额:" + balance);
} else {
System.out.println("余额不足");
}
}
}
BankAccount account = new BankAccount();
Thread thread1 = new Thread(() -> account.withdraw(5000));
Thread thread2 = new Thread(() -> account.spend(6000));
thread1.start(); // 启动李雷的线程
thread2.start(); // 启动韩梅梅的线程
// 等待两个线程执行完毕
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
```
在这个例子中,`withdraw` 和 `spend` 方法都被声明为 `synchronized`,这就意味着在同一时间只有一个线程能访问这个方法。这样就保证了对账户余额操作的原子性和一致性。
阅读全文