其他分享
首页 > 其他分享> > 单例模式

单例模式

作者:互联网

/**
 * 此方法虽然不是最好的实现方式,但是是最常用的单例实现方式。
 * 因为是类一开始即被装载,故不用担心线程安全的问题。
 * 缺点:造成内存浪费
 */
public class Singleton1 {
    //类装载的时候已经实例化了
    private final static Singleton1 instance = new Singleton1();
    //私有化构造器
    private Singleton1(){

    }
    //提供共有的获取方法
    public static Singleton1 getInstance(){
        return instance;
    }

}
/**
 * 双重检查写法
 * 通过声明volatile和双重加锁的方式实现了单例模式。
 * 内部加一层判断,其实在考虑多线程同时进入了第一层 if判断中时,都在等待着锁的释放,
 * 但是释放之后其他线程已经进入了第一层,那么单例模式的结构就会被打乱了,
 * 其实锁也可以加在方法上,只不过锁的粒度问题,节省了一点内存。
 */
public class Singleton2 {

    //volatile声明作用是内存变量共享作用
    private static volatile Singleton2 instance;
    private Singleton2(){}

    //提供公有的获取方法
    public static Singleton2 getInstance(){
        if (instance == null){
            synchronized (Singleton2.class){
                if (instance == null){
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }
}
/**
 * 静态内部类实现
 *
 */
public class Singleton3 {

    private Singleton3(){}
    //静态内部类不会再一开始被装载,所以没有内存消耗问题
    //JVM在装载静态内部类是线程安全的,只有在使用内部类才会去装载,所以线程是安全的
    private static class SingletonInstance{
        private static final Singleton3 instance = new Singleton3();

    }
    //提供静态共有获取方法
    public static synchronized Singleton3 getInstance(){
        return SingletonInstance.instance;
    }
}

 

标签:private,instance,static,模式,单例,Singleton2,Singleton1,public
来源: https://blog.csdn.net/qq_32295155/article/details/102775956