单例设计模式
单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
单例模式的特点:
- 将类的构造器的访问权限设置为private
- 类的外部只能调用该类的某个静态方法以返回类内部创建的对象
- 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
单例模式的优点:
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可 以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
懒汉式:(推荐使用)
当程序在需要的时候再进行实例化,双重检查机制解决线程同步问题
注意:
添加volatile关键字禁止指令重排序
public class LazySingleton {
//volatile关键字禁止指令重排序
private static volatile LazySingleton lazySingleton = null;
//私有化构造器
private LazySingleton() {
}
//双重检查机制
public static LazySingleton getInstance() {
if (null == lazySingleton) {
synchronized (LazySingleton.class) {
if (null == lazySingleton) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
饿汉式:
在类加载的时候,就已经进行实例化,无论之后用不用到。可避免线程同步问题。如果该类比较占内存,之后又没用到,就白白浪费了资源。
public class HungerSingleton {
//提供一个当前类的静态实例
private static HungerSingleton ourInstance = new HungerSingleton();
//私有化构造器
private HungerSingleton() {
}
//提供静态方法,返回当前类对象
public static HungerSingleton getInstance() {
return ourInstance;
}
}