VicroCode
让代码创造价值
VicroCode是一个轻量级代码在线发布、交易平台,开箱即用,免部署、免服务器、免备案,支持接入智能体、通用管理系统、游戏等多种项目
稍候片刻,您可先学习AI编程手册
正在加载中...

市场信息

[问与答] 如何分析这段线程安全的代码?

最近看了一道面试题(先查缓存,缓存中没有再查数据库),其实很久以前就遇到过,我以为已经掌握了, 但是今天再看,分析起来总觉得有些吃力,有种拿着答案分析过程的感觉,没有真正理解。 根据我的经验,应该在大脑中形成一个足够抽象的结构图,下次遇到这类问题,都可以套用。 想问问 v 友们如何分析这类问题?思维过程是怎样的?会在大脑中构建图像吗?

www.v2ex.com · 2026-09-10T11:06:24+00:00

最近看了一道面试题(先查缓存,缓存中没有再查数据库),其实很久以前就遇到过,我以为已经掌握了, 但是今天再看,分析起来总觉得有些吃力,有种拿着答案分析过程的感觉,没有真正理解。根据我的经验,应该在大脑中形成一个足够抽象的结构图,下次遇到这类问题,都可以套用。

想问问 v 友们如何分析这类问题?思维过程是怎样的?

会在大脑中构建图像吗? private final Map shopCache = new ConcurrentHashMap<>(); public Shop getShopById(Long shopId) { // 1. 先查本地缓存 Shop shop = shopCache.get(shopId); if (shop !

= null) { return shop; } // 2. 同一个 shopId 加锁 synchronized (getLock(shopId)) { // 3. 双重检查 shop = shopCache.get(shopId); if (shop ! = null) { return shop; } // 4. 缓存没有,查数据库 shop = shopMapper.selectById(shopId); // 5. 放入本地缓存 if (shop !

= null) { shopCache.put(shopId, shop); } return shop; } } private final Map locks = new ConcurrentHashMap<>(); private Object getLock(Long shopId) { return locks.computeIfAbsent(shopId, k -> new Object()); }

返回 AI 市场导读

来源:v2ex.com