知识卡片

高并发下单例Action改用原型模式克隆再配享元模式对象池

普通读书笔记卡 · 1852.b.6

内容

MVC框架每个HTTP请求开一个线程处理,若Action设计成单例,高并发下多线程共享 可变状态会互相干扰甚至线程不安全。解法分两步:先用原型模式,启动时初始化所有Action 作原型,每个请求clone一份处理,规避共享可变状态;但克隆量大会内存暴涨,再引入享元 模式建对象池收敛内存上限。发散:这是从”单例并发风险”到”原型内存风险”再到”享元收敛 内存”的完整权衡链条。

参考来源

- 位置:《设计模式之禅(第2版)》第37章《MVC框架》37.1.5节(源文件:_epub-src/text/part0159.html) - 结论依据:原文说明"每个HTTP请求都会产生一个线程,如果我们的Action初始化的时候是单例模式会出现什么情况?当并发足够多的时候就会产生阻塞,性能会严重下降,在特殊情况下还会产生线程不安全,这时就需要考虑多例情况。那多例是如何处理呢?使用Clone技术……典型的原型模式,但问题也同时产生了,并发较多时,就可能会产生内存溢出的情况,内存不够用了!于是享元模式就可以上场了,建立一个对象池以容纳足够多的对象"。 - 原始内容:每个HTTP请求都会产生一个线程,如果我们的Action初始化的时候是单例模式会出现什么情况?当并发足够多的时候就会产生阻塞……使用Clone技术,首先在系统启动时初始化所有的Action,然后每过来一个请求就拷贝一个Action……典型的原型模式,但问题也同时产生了,并发较多时,就可能会产生内存溢出的情况,内存不够用了!于是享元模式就可以上场了,建立一个对象池以容纳足够多的对象。