【问题标题】:Create new Java object every time or reuse one每次创建新的 Java 对象或重用一个
【发布时间】:2013-05-24 16:01:06
【问题描述】:

我在我的控制器中生成了许多 ModelAndView 对象(我发送的每个网页一个),但我不知道哪种策略会节省更多内存并且性能会更好。

这是我的两个选择:

1- 在我的控制器中保留一个属性并每次都重用它:

@Controller
public class MyController{
    private ModelAndView mav;

    public ModelAndView methodA() {
        mav = new ModelAndView(...);

        return mav;
    }

    public ModelAndView methodB() {
        mav = new ModelAndView(...);

        return mav;
    }

...
}

2- 为每个方法创建一个对象:

@Controller
public class MyController{

    public ModelAndView methodA() {
        ModelAndView mav = new ModelAndView(...);

        return mav;
    }

    public ModelAndView methodB() {
        ModelAndView mav = new ModelAndView(...);

        return mav;
    }

...

}

其中一个有什么重要的改进吗? 谢谢

【问题讨论】:

  • 这两个都不应该是您关心的问题。将模型映射与相应请求匹配的线程是最大的问题。选择#2,而不是#1。可变的共享状态只会给你带来悲伤。
  • 感谢您的回答。模型与请求匹配这么难?在什么意义上?
  • 不,这并不难,尤其是当您为每个请求创建一个时。这就是我的观点。
  • @duffymo 是的,我尝试这样做。谢谢。

标签: java object memory


【解决方案1】:

出于并发原因,一定要避免 #1。您可以让线程 A 运行方法 1,线程 B 运行方法 2,其中一个将更改 mav 对象,然后另一个可以使用它构造的对象。

【讨论】:

  • 你建议@Controllers 作为单身人士吗?
  • Spring MVC 控制器是一个 bean,因此您可以将其设为 Prototype 而不是 Singleton。默认情况下它是单例的。如果您指定原型范围,则示例 1 将是线程安全的,因为前端控制器将为每个请求创建一个新实例。就我个人而言,单例对我来说感觉更舒服,可能是因为 java servlet(也是控制器)每个 jvm 只实例化一次。
【解决方案2】:

如果对象不应该改变状态,这意味着您希望维护它,那么您可以使用单例并停止每次创建新实例。

【讨论】:

    【解决方案3】:

    我认为你正在寻找单例模式:-)

    这里有很好的例子说明:http://www.oodesign.com/singleton-pattern.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2014-03-09
      • 1970-01-01
      • 2014-09-02
      相关资源
      最近更新 更多