为什么jfinal的控制器不用单例模式
先假controller定采用单例模式,通常两种设计方式来存放 HttpServletRequest、HttpServletResponse 等对象,一是利用一个类似于 ActionContext 的对象然后用 ThreadLocal 绑定到当前线程,这种方式仍然要创建 ActionContext 对象,空间消耗并不比jfinal现在的controler模式少;二是不将 ActionContext 实例化,而是在 ActionContext 中使用多个 ThreadLocal 分别存放 HttpServletRequest、HttpServletResponse 等等请求上下文对象,采用多个 ThreadLocal 存放和读取 request、response 等对象的性能远不如 jfinal controller中的 getRequest()、getResponse(),并且通常这些对象是需要多次获取,所以需要多次从 ThreadLocal 中获取,并且在本次请求结束后需要在 finally 块中使用 threadLocal.remove() 掉这些对象,这也会消耗性能。
所以 Controller 做成单例,一是仍然无法避免 new 出对象来,二是从threadLocal中取数据性能远不如getter 方法,现在的服务器都是大内存,用空间换时间已成为更好的选择。
再假设 Controller 采用非单例模式,如果在 controller 定义了属性值,天然就可以避免线程安全问题。至于内存空间消耗可以精确地计算出来,Controller 类共有八个属性,其中三个是 static 全局共享的那么 Controller 对象占用内存情况:
Controller对象占用内存 = 对象头 + 属性指针 + 对齐填充 = 8 + 4*5 + 4 = 32Bytes
JVM存放每个字符使用 2个字节,那么一个controller对象仅相当于一个 16 个字符的String而已。
假定你的服务器每天接受 1亿次请求,创建 controller 需要的内存为:32Bytes * 1亿 = 2.98GB,一亿次请求创建Controller对象只需要 2.89GB内存,并且JVM 有自动回收内存的机制。相对于整个调用堆栈 controller 所占内存可以忽略不计,例如通常一次数据库访问 find(sql) 出来的数据所占内存远比多次创建 controller 对象要占用内存多得多。
为什么jfinal的控制器不用单例模式的更多相关文章
- springmvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
默认情况下是单例模式, 在多线程进行访问的时候,有线程安全问题. 但是不建议使用同步,因为会影响性能. 解决方案,是在控制器里面不能写成员变量. 为什么设计成单例设计模式? 1.性能(不用每次请求都创 ...
- Jfinal控制器源码解读
本文对Jfinal的控制器源码做以下分析. PS:控制器是所有请求跳转的基础,本文就Jfinal控制器的继承关系及初始化的方法做出解释说明. 啰嗦下:所有的请求和响应都是都是通过web容器封装,我们主 ...
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)【转】
介绍 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例 保证一个类仅有一个实例. Singleton using System; using System.Collections.Gene ...
- php设计模式——单例模式
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式. 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 ...
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...
- 设计模式 — 单例模式(Singleton)
在一个软件系统中,经常有有些特殊的对象就需要一个实例,如果有多个的话,就比较浪费服务器资源,最典型的就是 整个系统的配置文件对象. 普通方式读取配置文件 // 配置文件 SingletonApp.pr ...
- iOS 单例模式简单实例
单例模式主要实现唯一实例,存活于整个程序范围内,一般存储用户信息经常用到单例,比如用户密码,密码在登录界面用一次,在修改密码界面用一次,而使用单例,就能保证密码唯一实例.如果不用单例模式,init 两 ...
- 二十四种设计模式:单例模式(Singleton Pattern)
单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...
- PHP中单例模式与工厂模式
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式. 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 ...
随机推荐
- high-level operations on files and collections of files
11.10. shutil — High-level file operations — Python 3.6.5 documentation https://docs.python.org/3/li ...
- ABAP 检查全角半角
check全角or半角的方法 第一种方法SJIS_DBC_TO_SBC 全角转半角 SJIS_SBC_TO_DBC 半角转换为全角 设定 import all =xtext = 文本全角-〉半角,返回 ...
- (21) java web的struts2框架的使用-Action实现的三种方式
上一篇介绍了struts使用的四个步骤. 其中在开发action的时候,可以有三种实现方式: 1,写一个类,继承与ActionSupport 2,写一个类,实现Action接口 3,写一个类,实现业务 ...
- 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题
<Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题 这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...
- 获取Android APK JNI库
/************************************************************************** * 获取Android APK JNI库 * 说 ...
- win7上安装macaca的报错问题
macaca网上的各种教程中,都建议使用淘宝源安装macaca,使用淘宝源就需要先安装cnpm,在win7上切换到淘宝源安装cnpm后(npm install -g cnpm --registry=h ...
- eoj 3507 坑爹的售票机
EOJ 3507 坑爹的售票机 问题描述 oxx 和 xjj 决定和小伙伴们一同坐船前往 Xiamen.去 Xiamen 的船票一张 p 元. 当他们满怀兴致地来到港口时发现居然只有不设找零的自动 ...
- JS 对java返回的json格式的数据处理
var dataObj=eval("("+res+")"); alert(dataObj.billBuy) //res是如下的数据 {"billBuy ...
- MySQL中怎么查询一张表的列数
select count(1) from information_schema.columns where table_schema='dbname' and table_name='tbname;
- 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记
设计思路: (1) 一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2) “10ms延迟模块”检测到H2L_Sig高电平, ...