java单例和多例是什么?java 中 单实例和多实例是指的什么
大家好,关于java单例和多例是什么很多朋友都还不太明白,今天小编就来为大家分享关于java 中 单实例和多实例是指的什么的知识,希望对各位有所帮助!
单例,多例.各有什么优缺点
单例顾名思义就是是整个程序运行过程中只存在一个实例对象。常见的单例有静态类,enum,java设计模式中也有单例这一模式。
多例整个程序运行过程中只存在多个实例对象。每次使用的时候基本都是new出来的。
spring依赖注入默认使用的是单例。
如果类中存在有状态的变量,那么一般建议使用多例。因为单例的话再并发的场景下数据会相互干扰。而多例的话数据是隔离的。
如果类的实现都是无状态的,那么建议使用单例,一个实例减少类对象的开辟和gc,性能上可能会好点。
更多单例和多例的介绍参考:单例和多例的区别
java中,多态是多例还是单例
你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例。
你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例。
数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象。
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通常很难重现和查找;
java 中 单实例和多实例是指的什么
简单的说单例就是只能有一个实例,所以地方用到的实例都是同一个。
就好像家人吃饭,桌子是单例的,大家用的是同一个。而碗是多例的,每人都有自几的。下面是具体的例子:
Java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例:在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙"和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录数据库连接都需要这样的单线程操作。一些资源治理器经常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中治理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来治理这些属性文件。一个例子:Windows回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。两种形式:
1,饿汉式单例类
public class Singleton{ private Singleton(){}//在自己内部定义自己一个实例,是不是很希奇?
//注重这是private只供内部调用 private static Singleton instance= new Singleton();//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
} 2,懒汉式单例类 public class Singleton{ private static Singleton instance= null; public static synchronized Singleton getInstance(){//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if(instance==null)
instance=new Singleton();
return instance;}}
第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注重到lazy initialization形式中的synchronized,这个synchronized很重要,假如没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
一般来说第一种比较安全。进入讨论组讨论。
单例和多例的区别
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;
一、单例模式和多例模式说明:
1.单例模式和多例模式属于对象模式。
2.单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。
3.它们都不对外提供构造方法,即构造方法都为私有。
关于java单例和多例是什么和java 中 单实例和多实例是指的什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。