开发者社区> 问答> 正文

为什么jfinal的控制器不用单例模式? 400 报错

为什么jfinal的控制器不用单例模式? 400 报错

1,为什么jfinal的控制器不用单例模式的?虽然多例避免了线程安全的问题,但是假设访问量很大的话,将会创建很多对象,占用大量内存,性能就会下降。

2,单例模式-----一个请求------创建一个线程-------一个线程创建一个对象[controller]

   多例模式又是怎样的呢?   多个请求,一个线程,一个controller 吗?

  还是一个线程多个进程?

展开
收起
爱吃鱼的程序员 2020-05-30 23:35:43 888 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

          先假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 对象要占用内存多得多。

    ######赞,不明觉厉######刚才公司技术人员看了源码想要讨论这个问题,正好让他们看看######赞 又涨姿势了... 其实以前我就想问这个问题...######赞!![30]不明觉厉###### 不明觉厉啊!######涨知识了###### 我说一句啊,这个 单例模式 ,除了节省内存,还节省了cpu开支,每次请求创建一次对象,不但消耗,而且cpu创建对象要消耗很多时间,远大于get set,根本不可能有什么空间换时间的说法,自己建个spring mvc controller 和jfinal controller,都不用什么测试,自己页面上f5就知道优劣了
    2020-05-30 23:35:44
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring框架入门 立即下载
杜万-Java reactive programming - Reactor 3 and Spring WebFlux 立即下载
Java Spring Boot开发实战系列课程【第7讲】:Spring Boot 2.0安全机制与MVC身份验证实战(Java面试题) 立即下载