package com.javasc.reviewer2;

//1.饿汉方式实现单例设计模式

public class Singleton { //1.饿汉式的单例设计模式 //2.为了保证对象在堆内存种唯一存在,所以需要私有化类的构造器,保证别人可以通过静态方法调用;所以在函数之前需维护一个对象;

private static final Singleton INSTANCE = new Singleton();

private Singleton(){

}
//这种饿汉式有可能会占用空间,懒汉式的方法可能会导致多线程的问题
public static Singleton getInstance(){
    return INSTANCE;

}

}

//2.懒汉式单例设计模式

package com.javasc.reviewer2;

public class Singleton {

private static Singleton INSTANCE ;

private Singleton(){

}
//懒汉式的方法可能会导致多线程下存在问题,不能保证对象唯一;
//多核存在下如果某个核在if结束后想创建对象但是还没有创建对象是,其他的核也判断为空时,同样也会创建对象,无法保证单例;
public static Singleton getInstance(){
    if (INSTANCE == null){
        INSTANCE = new Singleton();
    }
    return INSTANCE;

}

}

//3.静态内部类实现懒汉式单例设计模式

package com.javasc.reviewer2;

public class Singleton {

//3.静态内部类实现单例,同样是懒汉式的单例设计模式,但是这种可以避免多线程的问题

//1.私有化构造器,不让别人创建对象;

private Singleton(){

}

//2.提供别人能够获得实例的函数

public static Singleton getInstance(){
    return SingletonHolder.INSTANCE;

}

private static class SingletonHolder{
    private static final Singleton INSTANCE = new Singleton();
    //为了使得别人不能修改,使用静态常量,final修饰;
}

} 静态内部类实现单例的理解:只有使用Singleton.getInstance(),函数会调用静态内部类,于是是静态内部类被第一次加载到内存之中 // 由于静态方法,静态变量会被jvm编译到static字节码中,而字节码中指令执行有且只有当类被加载到内存中执行,于是内部类中的代码会被执行, // 且只会执行一次,所以保证了这个类