MST

星途 面试题库

面试题:Java多线程环境下的线程安全问题及解决方案

在Java多线程编程中,线程安全是一个重要问题。假设你正在开发一个多线程访问的共享资源模块,如银行账户类,账户余额是共享资源,可能会有多线程同时进行存款和取款操作。请描述可能出现的线程安全问题,并给出至少两种解决该问题的方案及相应代码示例。
46.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

可能出现的线程安全问题

  1. 数据不一致:多个线程同时对账户余额进行操作,比如一个线程在读取余额后,另一个线程已经修改了余额,导致第一个线程基于旧的余额进行操作,最终造成数据不一致。例如,两个线程同时读取余额为100,一个线程取款50,另一个线程也取款50,若没有同步机制,最终余额可能是50而不是0。

解决方案及代码示例

  1. 使用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;
    }
}
  1. 使用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;
    }
}