java一个银行账户5000元,两夫妻一个拿着折,一个拿着卡,开始取钱比赛,每次只能取一千块钱,要求不准出现线程安全问题
时间: 2023-08-08 14:14:00 浏览: 42
可以使用Java中的锁机制来解决线程安全问题。以下是一个简单的实现:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BankAccount {
private int balance = 5000;
private Lock lock = new ReentrantLock();
public void withdraw(int amount) {
lock.lock();
try {
if (balance >= amount) {
Thread.sleep(100); // 模拟取款时间
balance -= amount;
System.out.println(Thread.currentThread().getName() + " 取出 " + amount + " 元,余额为:" + balance + " 元");
} else {
System.out.println(Thread.currentThread().getName() + " 取款失败,余额不足!");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
account.withdraw(1000);
}
}, "折子手");
Thread t2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
account.withdraw(1000);
}
}, "卡子手");
t1.start();
t2.start();
}
}
```
在上面的代码中,我们使用了一个 `Lock` 对象来保证同一时间只能有一个线程操作 `balance` 变量。当一个线程获取到锁之后,其他线程会被阻塞直到该线程释放锁。这样就能保证线程安全,避免多个线程同时修改 `balance` 变量导致的问题。