单例模式学习

单例模式

1. 单例模式的介绍

顾名思义,单例模式就是指一个对象只能有一个实例,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为,这样,单例就派上用场了。

2. UML图例说明

单例的UML图比较简单了,如下所示。

3. 单例模式的实现方式

3.1 懒汉式单例类

public class Singleton {    
    private static Singleton instance;
    private Singleton() {//私有化构造器,从而只有通过工厂方法返回实例

    }
    public static Singleton getInstance() { //静态工厂方法用于返回单一实例
        if (instance == null){//这里是为了程序性能优化
            synchronized (Singleton.class){//注意这里的加锁是必要的
                if (instance == null){//再次判断一次
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

之所以这种方式被称为懒汉式单例类,是因为它的实现当中,只有instance第一次被用到的时候才进行初始化的操作,同时,上面这段代码还有需要注意的几个地方。

  • 首先,第一个if判断是为了性能考虑的,因为如果instance不为空的话,就可以直接返回了,没有必要再进行加锁了。(这个if可以去掉)
  • 再次,synchronized加锁是防止多线程当中的竞争。
  • 最后,第二个if是防止instance已经被创建的情况,因为在有可能多个线程都通过了第一个if的判断,正在等待锁资源。

3.2 饿汉式单例类

public class Singleton {
    private static final Singleton instance = new Singleton();//final保证对象只是可读的
    private Singleton() {

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

可以看到,这种方式实现的单例类,在加载的时候就已经完成了类的实例化了,这种方式可以保证在多线程访问时的正确性,但是,它也有不好的地方,就是容易造成对资源的浪费,有可能在程序当中没有用到getInstance方法,但是还是实例化了一个Singleton对象出来。

3.3 枚举单例类

public enum Singleton {
    INSTANCE;
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

这种方式依赖于java内部枚举类型的实现,创建了一个单元素的枚举,所以保证了惟一性。(这种方式是从Effective Java这本书上看到的,只能说真的是厉害)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值