概述

有时候有这样一个需求:一个类对外只提供一个实例,并且只能有一个实例.
这时候就需要引入单例模式这种设计模式

分类

  • 饿汉式
    类加载完成时就完成了对类实例的实例化。
    优点:不涉及多线程问题,不需要考虑线程安全问题。
    缺点:类一加载就实例化,提前占用系统资源

  • 懒汉式
    类加载完成时不进行类实例的实例化,而是在类的实例使用的时候才进行实例化。
    优点:类一加载不对实例进行实例化,而是在使用时进行实例化。
    缺点:涉及多线程问题,需要考虑线程安全问题

饿汉式

饿汉式天生就是线程安全的,直接用于多线程不会出现问题。
实现代码:

public class Single {        private static final Single single = new Single();        private Single(){} // 构造方法私有化
        public static Single getInstance() {            return single;
        }
}

懒汉式

懒汉式本身就是非线程安全的,下面的例1展示了非线程安全的懒汉式,例2,3,4是实现懒汉式线程安全的3中方式。

1. 懒汉式(一定存在线程安全问题)

实现代码:

public class Single {    private static Single single;    private Single(){} // 构造方法私有化
    public static Single getInstance() {        if (single == null) {
            single = new Single();
        }        return single;
    }
}

注意: 在单线程状态下,这个懒汉式的单例可以正常工作,但在多线程环境下,仍然能产生多个实例。这就不符合最初的要求了,可以考虑加入锁的机制。

网友评论