单例模式(Singleton)
也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
一般通过 {className}.getInstance()来获得.
1: 饿汉式
特点: 线程安全,调用效率高,但是不能延时加载
public class Singleton {
private Singleton() {
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
//...other function
}
2: 懒汉式
特点: 线程安全, 调用效率不高, 可以延长加载.
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
}
//注意, 这里一定要用synchronized保证线程安全
synchronized public static Singleton getInstance(){
if( null == singleton )
singleton = new Singleton();
return singleton;
}
//...other function
}
3: 懒汉式--双重检查
特点: 线程安全, 调用效率高, 可以延长加载.
方法2中的性能不够好. 可以做如下的改进, volatile关键字的重要作用是禁止指令重排序, 保证内存不会出现内存分配, 返回对象引用, 初始化这样的错序.
下面的代码即为饿汉式的双重检查.
public class Singleton {
private Singleton(){}
private volatile static Singleton singleton = null;
public static Singleton getInstance(){
if( null == singleton ){
synchronized (Singleton.class){
if( null == singleton ){
singleton = new Singleton();
}
}
}
return singleton;
}
}
4: 枚举
特点: 线程安全, 调用效率高, 不能延长加载, 代码精简
public enum Singleton {
INSTANCE;
}