单例模式的实现方式有很多,常用的是双重检测锁方式,优点是代码简单,逻辑清晰,缺点是极其稀少情况下会失效。
当然,用枚举方式或静态内部类方式更值得推荐。
总之,作为反模式应用,这个算简单高效的。示例如下:
/** * 单例模式(双重检测锁,分三步): * 一、定义静态实例变量; * 二、隐藏构造函数; * 三、公开静态方法供外部调用以返回静态实例对象。 * <br/> * 也许,以volatile修饰静态变量能让本单例更有效 */ public class SingletonDemo { /** * 单例模式(三步之一): * 定义静态实例变量; */ private static SingletonDemo instance; // private static volatile SingletonDemo instance; /** * 单例模式(三步之二): * 隐藏构造函数; */ private SingletonDemo() { } /** * 单例模式(三步之三): * 公开静态方法供外部调用以返回静态实例对象。 * @return 返回该单例类的全局唯一实例对象。 */ public static SingletonDemo getInstance() { //测试确保静态实例对象尚未实例化,范围是是当前线程内 if(instance==null) { //同步线程内的该单例类 synchronized (SingletonDemo.class) { //再次测试确保静态实例对象尚未实例化,同步后范围就代表所有线程 if(instance==null) { //经两次测试后还为null时,即可放心地实例化这个单例对象了 instance = new SingletonDemo(); } } } return instance; } }