一、拍脑袋想的版本:
package singleton;
//单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
//此种方式存在线程安全问题。
public class SimpleSingleton {
private static SimpleSingleton instance;
//为了保证一个类只有一个实例,那构造函数需要私有化,防止外部随意生成实例。
private SimpleSingleton(){}
//提供一个全局的访问点 并且是懒加载的
public static SimpleSingleton getInstance(){
if(instance==null){
instance=new SimpleSingleton();
}
return instance;
}
}
二、线程安全版本(性能存在缺陷)
package singleton;
public class SafeSingleton {
public static SafeSingleton instance;
private SafeSingleton(){}
//加入synchronized保证线程安全,但存在性能问题,其实只有在第一个生成instance时
//才需要加锁保证线程安全,接下来获取instance时并不需要加锁了。
public static synchronized SafeSingleton getInstance(){
if(instance==null){
instance=new SafeSingleton();
}
return instance;
}
}
三、高效且线程安全版本
package singleton;
public class PerfactSingleton {
private volatile static PerfactSingleton instance;
private PerfactSingleton(){}
public static PerfactSingleton getInstance(){
if(instance==null){
synchronized (PerfactSingleton.class) {
instance=new PerfactSingleton();
}
}
return instance;
}
}
四、饿加载方式
package singleton;
public class EagerSingleton {
private static EagerSingleton instance=new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return instance;
}
}