MST

星途 面试题库

面试题:Go语言嵌套Map结构中数据的高效查询与更新

给定一个嵌套Map结构,外层Map的键是用户ID(字符串类型),内层Map的键是产品ID(整数类型),值是产品的购买数量(整数类型)。请编写一个函数,高效查询某个用户对某个产品的购买数量,并实现对购买数量进行更新的功能,同时说明如何在并发场景下保证数据的一致性。
34.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

public class UserProductPurchase {
    private final Map<String, Map<Integer, Integer>> purchaseMap = new HashMap<>();
    private final ReentrantLock lock = new ReentrantLock();

    // 查询某个用户对某个产品的购买数量
    public int queryPurchaseQuantity(String userId, int productId) {
        lock.lock();
        try {
            Map<Integer, Integer> productMap = purchaseMap.get(userId);
            if (productMap != null) {
                return productMap.getOrDefault(productId, 0);
            }
            return 0;
        } finally {
            lock.unlock();
        }
    }

    // 更新某个用户对某个产品的购买数量
    public void updatePurchaseQuantity(String userId, int productId, int quantity) {
        lock.lock();
        try {
            purchaseMap.putIfAbsent(userId, new HashMap<>());
            Map<Integer, Integer> productMap = purchaseMap.get(userId);
            productMap.put(productId, quantity);
        } finally {
            lock.unlock();
        }
    }
}

在并发场景下保证数据一致性的方法:

  1. 锁机制:如上述代码使用ReentrantLock,在查询和更新操作前后加锁和解锁,确保同一时间只有一个线程能访问和修改数据,避免数据竞争。
  2. 使用线程安全的集合:例如ConcurrentHashMap,它内部实现了线程安全机制,允许高并发访问。但如果要对嵌套结构中的值进行原子性更新,可能仍需额外的同步机制。
  3. 读写锁:若读操作远多于写操作,可以使用读写锁(如ReentrantReadWriteLock),允许多个线程同时进行读操作,而写操作时会独占锁,确保写操作的原子性和数据一致性。