面试题答案
一键面试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();
}
}
}
在并发场景下保证数据一致性的方法:
- 锁机制:如上述代码使用
ReentrantLock
,在查询和更新操作前后加锁和解锁,确保同一时间只有一个线程能访问和修改数据,避免数据竞争。 - 使用线程安全的集合:例如
ConcurrentHashMap
,它内部实现了线程安全机制,允许高并发访问。但如果要对嵌套结构中的值进行原子性更新,可能仍需额外的同步机制。 - 读写锁:若读操作远多于写操作,可以使用读写锁(如
ReentrantReadWriteLock
),允许多个线程同时进行读操作,而写操作时会独占锁,确保写操作的原子性和数据一致性。