再谈设计模式之-1.单例模式

作为一个程序猿单例模式大家再熟悉不过了.

示例

除了饿汉单例

public class Singleton { 
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}

懒汉式单例

public class Singleton {
private static Singleton singleton;
private Singleton(){}

public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}

还有登记式单例(http://shuidexiongdi.iteye.com/blog/1208099)

单例模式的优点:

1.内存中之存在一个实例,节省资源
2.避免了对象的频繁创建消除
3.可以全局访问

单例模式使用注意事项

1.构造方法必须是静态
2.不要通过反射的方式获取对象
3.在多线程的使用场景下注意并发问题.
如:懒汉式 getInstance方法在高并发的场景下是可以优化的

public class Singleton {
private static volatile Singleton singleton;
private Singleton(){}

public static Singleton getInstance(){
if(singleton==null){
    synchronized(Singleton.class){
        if(singleton==null) singleton = new Singleton();
    }
}
return singleton;
}
}

使用double check 替换加在方法上的synchronized 较少并发情况下资源竞争的粒度

单例模式相对静态方法的优势
1.从设计的角度来说 单例可以实现接口但是静态类不行,使用静态类那么使用者和静态类建立了直接的联系,重设计原则来说类与类之间最好你不认识我,我不认识你,解耦.使用静态类破坏了这点.
2.从初始化的角度来说 单例可以延时加载,而静态类不可以,针对初始化复杂的场景延时加载很有用
3.从线程安全的角度来说 单例相比静态类更容易处理并发问题

最后单例模式可以抽象下概念.扩大应用场景
比如在线程中单一实例. 在JVM中单一实例,在集群中单一实例.都可以称为单例.

上一篇:JVM Class详解之一


下一篇:JVM Class详解之二 Method字节码指令