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字节码中,而字节码中指令执行有且只有当类被加载到内存中执行,于是内部类中的代码会被执行, // 且只会执行一次,所以保证了这个类