每天一个设计模式-----单例模式
什么是单例模式
- 就是一个类只有一个实列,只有一个公共的调用点,只能通过这个公共的调用点来调用该实列
单例模式的特点
- 1.只有一个实例
- 2.单例类必须自己创建自己的唯一实例。(自我实列化)
- 3.提供全局调用 点(单例类必须像所有的对象提供自己)
线程安全问题
- 虽然说单例对象只有一个实例,但是在多线程的情况下,如果有多个线程同时操作这个单例对象会造成线程不安全,所以推荐如果要使用单例那么最好是vo,to等类型,因为private修饰的变量是放在用户栈的属于线程的须有区域
如何构建单例模式
1. 饿汉式单例
- 饿汉式单例式线程安全的,因为只要系统不重启,他就一直都是一个对象。而且因为私有构造被申明为私有,外部无法通过构造去实列化,但是通过反射依然可以实列化
// 饿汉式单例
public class Singleton1 {
// 私有构造
private Singleton1() {}
private static Singleton1 single = new Singleton1();
// 静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
2.懒汉式单列
- 问题:如果一个线程正在创建对象,但是另外一个线程进来的时候发现没对象,也会进行创建,导致产生多个对象
// 懒汉式单例
public class Singleton2 {
// 私有构造
private Singleton2() {}
private static Singleton2 single = null;
public static Singleton2 getInstance() {
if(single == null){
single = new Singleton2();
}
return single;
}
}
- 解决:加锁
// 懒汉式单例
public class Singleton2 {
// 私有构造
private Singleton2() {}
private static Singleton2 single = null;
public static Singleton2 getInstance() {
if(single == null){
single = new Singleton2();
}
return single;
}
}
借鉴:https://www.cnblogs.com/garryfu/p/7976546.html