剑指offer(1):实现Singleton单例模式

来源:互联网 发布:护腰带腰椎间盘 知乎 编辑:程序博客网 时间:2024/05/16 08:04

题目描述:

设计一个类,只能生成该类的一个实例。

思路:
考察单例模式的运用。运用单例模式是需要考虑多线程环境下的安全同步机制、内存的使用效率。

可行的解法:加锁前后两次判断实例是否存在
初始实例instance为空,静态方法调用时new出新的实例。用2次if判断提高效率,但是代码比较复杂,容易出错。

public class Singleton {    private static Singleton instance = null;    // 私有构造方法    private Singleton() {    }    // 静态方法构造实例,双重加锁检查    public static Singleton getInstance() {        if (instance == null) {            synchronized (Singleton.class) {                if (instance == null) {                    instance = new Singleton();                }            }        }        return instance;    }}

推荐方式1:静态方法
初始实例instance直接构造,在类加载是只进行一次初始化;利用静态方法返回该实例。避免了加锁同步。

public class Singleton {    private static Singleton instance = new Singleton();    // 私有构造方法    private Singleton() {    }    // 静态方法返回实例    public static Singleton getInstance() {        return instance;    }}

推荐方式2:静态内部类
只有调用getInstance()方法时,才回构造出静态内部类INstanceHolder的实例,并返回Singletondu实例,实现了按需创建,延时加载。

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

参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

0 0
原创粉丝点击