定义:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
作用:
我的理解:单例,单例,就像“三代单传”一样,肯定是当宝贝一般的。不让乱改的。
分析:
根据定义分析出如下要点:
1. 某个类只能有一个实例
2. 它必须自行创建这个实例
3. 它必须自行向整个系统提供这个实例
说人话就是具体实现为以下几点:
1. 只提供私有构造方法
2. 类定义中含有一个该类的静态私有对象
3. 该类提供一个静态的公有的函数用于创建或获取它本身的静态私有对象
注:代码实现中的 1 2 3 数字分别对应这三条
Java代码实现:
非延迟加载单例 —— 饿汉式
public class Singleton {
// 2
private static final Singleton instance = new Singleton();
// 1
private Singleton() {
}
// 3
public static Singleton getInstance() {
return instance;
}
}
优点:线程安全、简单
缺点:当程序启动,类加载后就创建了,一直占着内存,直到。。。
延迟加载单例 —— 静态内部类实现
public class Singleton {
private static class SingletonHolder {
// 2
private static final Singleton instance = new Singleton();
}
// 1
private Singleton() {
}
// 3
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
优点:延迟加载,节省内存,线程安全
上面两种实现方式,是在不使用 反射 的情况下,才会得到保证。
非延迟加载 —— 枚举
public enum Singleton {
INSTANCE; // 1 2 3
}
优点:哎,反射不好使。
缺点:当程序启动,类加载后就创建了,一直占着内存,直到。。。
参考:
- http://blog.csdn.net/goodlixueyong/article/details/51935526
- http://blog.csdn.net/jason0539/article/details/23297037
- http://www.iteye.com/topic/652440
- http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html
- https://baike.baidu.com/item/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/5946627?fr=aladdin
=========================== 分 割 线 =============================
还有一种懒汉式的单例实现,但是看到网上分析说,很多实现是有问题的,又才疏学浅,不敢乱写,遂弃之。
网友评论