1.饿汉模式
特点:应用程序启动时,完成类加载(实例对象的创建),由此可得,加载速度慢,因类已加载完毕,从而运行时获取对象快;
2.懒汉模式
特点:与饿汉模式相反,调用实例对象创建时慢(调用创建实例方法才进行实例对象的创建)。
代码如下:
饿汉模式
public class Stringleton {
//1.将构造方法私有化, 不允许外面直接进行创建
private Stringleton(){
}
//2.声明类的唯一实例, 使用 private static修饰
private static Stringleton stringleton = new Stringleton();
//3.提供一个获取实例的方法, 使用 public static修饰
public static Stringleton getInstance() {
return stringleton;
}
}
上述代码中的一个缺点是该类加载的时候就会直接new 一个静态对象出来,当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。
懒汉模式
public class Stringleton {
//1.将构造方法私有化, 不允许外面直接进行创建
private Stringleton(){
}
//2.声明类的唯一实例, 使用 private static修饰
private static Stringleton stringleton ;
//3.提供一个获取实例的方法, 使用 public static修饰
public static Stringleton getInstance() {
if (stringleton == null) {
synchronized (Stringleton.class) {
if (stringleton == null) {
stringleton = new Stringleton();
}
}
}
return stringleton;
}
}
上述代码中的一次锁住了一个方法, 这个粒度(频率)有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。