1.单例模式的主要特点:
- 构造函数不对外开放,一般为private;
- 通过一个静态方法或枚举返回单例类对象;
- 确保单例类的对象有且只有一个,尤其是在多线程的情况下;
- 确保单例类对象在反序列化时重新构建对象。
2.主要优点:
- 单例模式提供了对唯一实例的受控访问;
- 由于系统内存只存在一个对象,因此可以节约系统资源;
- 允许可变数目的实例。
3.主要缺点:
- 由于单例模式没有抽象层,拓展比较困难;
- 单例类的职责过重,在一定程度上违背了“单一职责原则”;
- 现在很多面向对象语言提供了垃圾回收机制,因为如果实例化的对象很长时间没有引用,会被系统回收,单例对象的状态会发生丢失。
4.单例模式的写法总结:
- lazy initialization, thread-unsafely (懒汉法,线程不安全)
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if(instance == null)
instance = new Singleton();
return instance;
}
}
- 使用synchronized方法同步,线程安全,但会让函数执行效率糟糕一百倍以上
public static synchronized Singleton getInstance() {
if(singleton == null)
instance = new Singleton();
return instance;
}
- lazy initiation ,thread-safety, double-checked(懒汉法,线程安全)
public class Singleton {
private volatile static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null){
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
volatile关键字 用来确保将新的变量的更新操作通知到其他线程,保证新值能立即更新到内存,以及每次使用前立即从主内存刷新,当把变量声明为volatile类型后,编译器和运行时都会注意到这个变量是共享的。
参考文章链接:blog.csdn.net/self_study/…