可能出现的线程安全问题
- 数据不一致:多个线程同时对账户余额进行操作,比如一个线程在读取余额后,另一个线程已经修改了余额,导致第一个线程基于旧的余额进行操作,最终造成数据不一致。例如,两个线程同时读取余额为100,一个线程取款50,另一个线程也取款50,若没有同步机制,最终余额可能是50而不是0。
解决方案及代码示例
- 使用
synchronized
关键字
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public synchronized void deposit(double amount) {
balance += amount;
}
public synchronized void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
}
}
public double getBalance() {
return balance;
}
}
- 使用
ReentrantLock
import java.util.concurrent.locks.ReentrantLock;
public class BankAccountWithLock {
private double balance;
private ReentrantLock lock = new ReentrantLock();
public BankAccountWithLock(double initialBalance) {
this.balance = initialBalance;
}
public void deposit(double amount) {
lock.lock();
try {
balance += amount;
} finally {
lock.unlock();
}
}
public void withdraw(double amount) {
lock.lock();
try {
if (balance >= amount) {
balance -= amount;
}
} finally {
lock.unlock();
}
}
public double getBalance() {
return balance;
}
}