一、什么是单例模式?
单例模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。例如 AppConfig文件。
二、使用单例模式有什么好处?
-
对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
-
由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。
三、单例模式的实现方式:
1.饿汉式
public class Singleton {
private Singleton(){
}
private static Singleton instance = new Singleton();
public static Singleton getInsatnce(){
return instance;
}
}
2.懒汉式
下面这种写法为线程安全,但效率较低的一种实现
public class LazySingleton {
private LazySingleton(){
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
下面这种写法为线程安全,但效率较高的一种实现
public class LazySingleton {
private LazySingleton instance;
private LazySingleton(){}
public LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
<span style="white-space:pre"> </span>if(instance == null){
instance = new LazySingleton();
}
}
}
return instance;
}
}
public class Singleton {
private Singleton(){}
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
上面的代码,当外部类被初始化时,内部类不会被初始化,只有当调用getInstance()方法 才会初始化Singleton对象。 由于实例的建立是时在类加载时完成,所以也是线程安全的。