一、拍脑袋想的版本:
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; } }