【Java】单例模式

98 阅读1分钟

Java程序中使用的日志,配置读取等都需要用到单例。

17.1 饿汉模式【可用】

在类加载(连接完成)之后,即创建单例对象。不能实现懒加载,耗资源。

public class Singleton {
 
	private static Singleton instance=new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){
		return instance;
	}
}

17.2 懒汉模式

实现懒加载,但线程不安全

public class Singleton {
 
	private static Singleton instance=null;
	
	private Singleton() {};
	
	public static Singleton getInstance(){
		
		if(instance==null){
			instance=new Singleton();
		}
		return instance;
	}
}

17.3 懒汉模式【双重校验锁】

实现懒加载,并且线程安全。

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

17.4 内部静态类【可用,推荐】

在类初始化时,执行静态类和方法。实现懒加载,并且线程安全。

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}

17.5 枚举类【可用,推荐】

实现懒加载,并且线程安全。是官方推荐的单例实现方式。

public class Singleton {

    private Singleton(){

    }

    private enum SingletonEnum{
        INSTANCE;

        private final Singleton instance;

        SingletonEnum(){
            instance = new Singleton();
        }

        private Singleton getInstance(){
            return instance;
        }
    }

    public static Singleton getInstance(){
        return SingletonEnum.INSTANCE.getInstance();
    }
}

//访问方式
Singleton.getInstance();