单例模式大概是程序员面试时被问最多的设计模式,但真到生产环境,它像个沉默的室友——你几乎意识不到它的存在,直到出问题。
Spring和Quarkus这类框架把单例藏得很深。你写个@Service注解,框架默默保证全局只有一个实例,省内存、省连接池开销。但「保证只有一个实例」这件事,在并发场景下没那么容易。多个线程同时判断"实例存在吗",可能瞬间造出两个对象,然后框架还得靠双重检查锁或枚举来兜底。
更隐蔽的坑在测试环节。单例一旦初始化,状态会污染后续用例。开发者常发现本地测试全过,CI环境却随机失败——后来才意识到是某个单例里的缓存没清干净。Quarkus文档里甚至专门警告:别在单例里存请求级别的数据。
框架把复杂性包进注解,开发者以为自己在写业务代码,实际上在跟全局状态打交道。有个经典吐槽:单例模式就像全局变量穿了件西装,体面了,但本质没变。
Spring Boot 3.2之后开始推作用域代理,试图缓解这个问题。但老项目里那些@Autowired的单例服务,估计还得再跑十年。
热门跟贴