Java 设计模式之单例模式-- 饿汉式和懒汉式

Java的设计模式,大体上可以分为23种类型,今天浅谈下单例模式。

单例模式,顾名思义,只有一个实例。单例的实现有两种,叫饿汉式和懒汉式。

 

1、饿汉式--顾名思义,很饥饿,不管你有没有调用,我类加载的时候就直接生成一个单例。这个模式是线程安全的。代码如下:

public class EagerSingleton {
    private static EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {

    }
    public static EagerSingleton getInstance() {
        return instance;
    }
}

说明:

①instance属性必须是private static的。保证两点:1、不能能被外部调用,2、类加载的时候就会执行,就会生成一个实例。

②getInstance方法必须是static的。两点原因:1、因为instance是static的,所以方法必须是static的,2、只能通过类调用方法,不能通过实例对象.方法的形式去调用。

③必须要有一个私有化的构造器,是为了防止new一个新的对象。

 

2、懒汉式--顾名思义,比较懒,调用的时候才会去生成实例。线程不安全的,代码如下:

public class LazySingleton {

    private static LazySingleton instance = null;

    private LazySingleton() { }

    public static LazySingleton getInstance() {
        if (instance = null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

说明:

①private  和 static的修饰和饿汉式的原因一样。

②如果是多线程系统,此处是线程不安全的。分析:有A、B两个线程来调用getInstance方法,线程A判断了if条件之后,线程挂起了。这个时候B线程进来了,走到if判断那里,判断为true,然后继续向下走。这个时候先new了一个对象出来,然后返回了。这个时候A线程继续向下执行,就会再次new一个对象出来。这样,这个对象就不是单例了。

 

优化:

在if判断的时候,加上同步锁,代码如下:

synchronized (LazySingleton.class) {
   if (null == instance) {
       instance = new LazySingleton();
    }
} 

加上synchronized 锁之后,就是线程安全的了,只会new 出一个实例来。

你可能感兴趣的:(Java 设计模式之单例模式-- 饿汉式和懒汉式)