单例模式

157 阅读1分钟

定义:

一个类只有一个实例,而且可以自行实例化并像整个系统提供这个实例

例:饿汉式

public class Single{
    public Single single = new Single();
    private Single(){}
    public static Single getInstance(){
        return single;
    }
    public static void doSomething(){
        
    }
}

私有化构造避免重复创建对象
单例中的方法多为静态方法

优点:

a:减少内存开支,因为只有一个对象
b:减少系统创建对象开销
c:避免对资源的多重占用
d:优化共享资源的访问

缺点:

a:不利于扩展
b:与单一原则冲突
c:并行项目开发,单例类没有创建无法测试

单例模式注意事项

并发情况下使用单例

懒汉和饿汉模式,区别在于懒汉模式在需要的时候创建,线程可能不安全
饿汉模式在类加载时候创建,线程安全

懒汉式

1.方法加同步锁
public class Single{
    private Single(){}
    
    private static Single single;
    
    public static synchronized Single getInstance(){
        if(single == null){
            single = new Single();
        }
        return single;
    }
}

2.同步锁双层判断DCL模式

volatile1.5后java的加载方式发生变化,所以可能会出现指令集乱序问题

public class Single{
    private Single(){}
    
    private static volatile Single single;
    
    public static Single getInstance(){
        if(single == null){
            synchronized (Single.class){
                if(single == null){
                    single = new Single();
                }
            }
        }
        return single;
    }
}

3.内部类实现方案,避免了同步锁带来的效率问题
public static Single{
    private Single(){}
    private static class SingleHolder{
        private static final Single INSTANCE = new Single();
    }
    public static final Single getSingle(){
        return SingleHolder.INSTANCE;
    }
}

饿汉式

例子同本页开始方式

登记式

Spring模式

TODO:以后懂了在写