中易网

java单实例的好处

答案:3  悬赏:50  
解决时间 2021-01-29 09:51
java单实例的好处
最佳答案
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

最显而易见的好处是,节约开销,比如数据库链接单例的好处是,每次你只要去获取那个数据库的实例就好,不用每次去创建一个实例。
全部回答
单例模式
定义:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。
另外方面,Singleton也能够被无状态化。提供工具性质的功能,
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。
如何使用?
一般Singleton模式通常有几种形式:
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
使用Singleton.getInstance()可以访问单态类。
上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,有兴趣者进一步研究。
一般认为第一种形式要更加安全些。
使用Singleton注意事项:
有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的。
我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下:
在Pet Store中ServiceLocator有两种,一个是EJB目录下;一个是WEB目录下,我们检查这两个ServiceLocator会发现内容差不多,都是提供EJB的查询定位服务,可是为什么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator属于资源定位,理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用,所以ServiceLocator才分成两种,一种面向WEB服务的,一种是面向EJB服务的。
Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java的类 线程 内存等概念有相当的了解。
经常被调用的类可以定义为单例模式以提高效率,但是注意线程同步
1.定义单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。2.使用场合简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.(1)配置信息类负责配置文件的解析,通常被设计为单例类(2)管理类如连接池管理类,通常被设计为单例类(3)控制类如struts的ActionServlet类,也是单例类。如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。Java代码:<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> (4)门面类说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。(5)代理类在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。3.单例模式在Java语言的实现单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。(1)饿汉式单例类饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。Java代码:public class Singleton2{
//注意这是private
private static Singleton2 theInstance = new Singleton2();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton2 getInstance(){
return theInstance;
}
}
public class Singleton2{
//注意这是private
private static Singleton2 theInstance = new Singleton2();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton2 getInstance(){
return theInstance;
}
}
1.定义单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。2.使用场合简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.(1)配置信息类负责配置文件的解析,通常被设计为单例类(2)管理类如连接池管理类,通常被设计为单例类(3)控制类如struts的ActionServlet类,也是单例类。如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。Java代码:<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> (4)门面类说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。(5)代理类在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。3.单例模式在Java语言的实现单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。(1)饿汉式单例类饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。Java代码:public class Singleton2{
//注意这是private
private static Singleton2 theInstance = new Singleton2();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton2 getInstance(){
return theInstance;
}
}
public class Singleton2{
//注意这是private
private static Singleton2 theInstance = new Singleton2();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton2 getInstance(){
return theInstance;
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
世界时区 西三区20时 东八区是几时
背帐1500万到手500万,签免还协议,有什么后
有没有觉得小头短脸的男人普遍很蠢?
求《亚人》动漫第二季,《文豪野犬》第二季百
拍电报成语
是一双真的Nike吗
泸州市纳溪区天化幼稚园怎么去啊,有事要去办
语文赏析一般用语
在steam市场上买的分身弧怎么不是一对的
有睢宁的吗?睢宁哪里有绣花厂啊?
封神英雄榜第二部邓婵玉是哪一集出来的
吉林移动全球通卡资费
窑上中心小学地址在哪,我要去那里办事
阿迪达斯所有品牌标志图片
1.68除以2.1的竖式
推荐资讯
为什么正常人无法站在用户角度思考
当归和黄芪可以天天喝吗
鼻子两边有一圈红的..
停车场(盛世家园东)(明霞大道北150米停车场)
英雄联盟IPL世界总决赛视频
新疆有童姓分布吗
南北方做古琴有什么区别
上通宵对身体有什么害处?
唱快歌老跟不上歌词怎么办
我住九楼的东边有一个33层的楼房风水好吗?
女人频繁提醒你,说要离开,是什么意思
天花板是这样的。算不算头顶悬梁
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?