单例的定义
Singleton模式主要作用是保证在Java应用程序中一个类Class只存在一个实例。
作用
- Singleton能够被无状态化,提供工具性质的功能
- Singleton可以节省内存,它限制了实例的个数,有利于Java的垃圾回收
UML
u=2748590673,1305504868&fm=27&gp=0.jpg代码示例
- 第一种形式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
- 第二种形式(懒加载)
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
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实例。
- 一般认为第一种形式要更加安全一些
- 在某些情况下,使用Singleton并不能达到Singleton的目的,如果有多个Singleton 对象同时被不同的类装入器装载:在EJB这样的分布式系统种也要注意这种情况,因为EJB是夸服务器的,跨JVM的。
总之,如果你的应用是基于容器,那么Singleton模式少用或者不用。可以使用相关技术替代。
网友评论