单例和多例的区别

news/2024/7/7 18:35:09

为什么80%的码农都做不了架构师?>>>   hot3.png

需要明白以下几个问题:

1. 什么是单例多例;2. 如何产生单例多例;3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例;

1. 什么是单例多例:

单例:所有的请求都用一个对象来处理。比如我们常用的service和dao层的对象通常都是单例的。

多例:每个请求用一个新的对象来处理。比如action。

2. 如何产生单例多例:

在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加

        scope="prototype"; 

3. 为什么用单例多例:

 用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;

 用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;

 用单例和多例的标准只有一个:

        当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;

4. 何时用单例?何时用多例?

    对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;

    而对于struts1来说,action则可用单例,因为请求参数的值是放在actionForm中,而非action中的;

    另外要说一下,并不是说service或dao一定是单例,标准同第3点所讲的,有的service中也包含了可改变的状态,同时执行方法也依赖该状态,但一样用的单例,这样就会出现隐藏的BUG,而并发的BUG通常很难重现和查找;

转载于:https://my.oschina.net/anlve/blog/1815133


http://lihuaxi.xjx100.cn/news/236924.html

相关文章

区块链简史:解读这场技术革命的前世今生

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 真格基金徐小平的一个“内部讲话”被泄露,揭开了创投圈对区块链的新一轮热衷。 在这份微信群的“内部讲话”中,徐小平把区块…

中英文统计

第一种方法: foopen("sunstr.txt","r",encoding"utf-8") sunstrfo.read().lower() for ch in ",.":sunstr.replace(ch," ") sunstr sunstr.split(); sunstrset set(sunstr)dic {} for i in sunstrset:dic[i] …

spring体系

2019独角兽企业重金招聘Python工程师标准>>> 一、spring从体系架构上分为 1. 基本组件框架组合:Spring Framework 2.专项领域应用组件:Spring Portfolio 这个Spring Portfolio主要应用满足于特定的的应用场合:包括了spring Securi…

简单粗暴告诉你什么是区块链

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链是什么?它是如何工作的? 比特币已经成为现代互联网的潮流 - 随之而来的是区块链。人们说区块链技术将导致互联网运作…

Mybait缓存机制

MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持。 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空。 二级缓存:二级缓存和一级缓存机制相同,但是可以自…

ES6基础之Array.fill函数

引子 关注「时事」的同学都会注意到,ES6和TypeScript是时下「投资」的热门。作为一位老同学,我也注意到这一点,不断收集一些小东东,以备不时之需。 正题 本文中记录的是ES6为Array增加的fill()函数。其功能是,用户可以…

Java堆内存分配与回收策略

java主要在堆上分配内存,而Java堆又分为新生代(YoungGen)和老年代(OldGen)两个部分,新生代又再分为Eden区和Survivor区两部分,本文根据java堆的划分,描述hotspot的内存分配策略。 GC垃圾收集分类 Minor GC: 发生在新生代中的垃圾…

“区块链”究竟是什么

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 什么是区块链? 说到区块链,就不得不说比特币。   2008年底,比特币之父中本聪发表了一个关于他研究的电子现金…