1:饿汉模式/立即加载。立即加载就是使用类的时候已经将对象创建完毕。
public class Singleton{
private static Singleton singleton = new Singleton();//static 变量属于类
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
}
2:延迟加载/懒汉模式。在调用get()方法时,实例才会被创建,常见的视线办法就是在get()方法中进行new实例化
public class Singleton{
private static Singleton singleton;
private Singleton(){
}
public static Singleton getInstance(){
if(singleton != null){
}else{
singleton = new Singleton();
}
return singleton;
}
}
缺点 :还是一样 在多线程环境下,不能保持单例状态。解决方案
直接在方法上加锁,synchronized,但是效率低。下面使用双检查锁机制
public class Singleton{
private volatile static Singleton singleton;//为什么要加volatile,涉及到指令重排序问题,我会写一篇详细介绍。
private Singleton(){ //现在当singleton变量被初始化成实例时会正确的处理singleton,确保各个线程的可见性
}
public static Singleton getInstance(){
if(singleton != null){
}else{
synchronized(Singleton.class){
if(singleton == null){
singleton == new Singleton();
}
}
}
return singleton;
}
}