1.单例模式
单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点
应用场合:网站计数器、工具类等
作用:保证整个应用程序中的某个实例(创建对象)有且只有一个
类型:饿汉模式、懒汉模式
饿汉模式:
由于创建的实例只有一个,则需要去修改该类的默认构造方法
1.将构造方法私有化,不允许外部直接创建对象
2.创建类的唯一实例(为保证在外部可以访问,则需要static修饰符)
3.为保证其实例的安全性,需要把类的唯一实例私有化,在提供一个公开的获取实例的方法
在考虑的单利模式加载方式的时候,我们需要考虑其加载方式(按照第一种加载方式,就是当类加载时,已经在加载,其模式为饿汉模式)
懒汉模式:
1.将构造方法私有化,不允许外部直接创建对象
2.声明类的唯一实例(使用private static 进行修饰)
3.提供获取实例的方法(使用public static 进行修饰,由于其第二步的时候,只是声明了实例,没有进行实例化,当用户去获取时,获取到的实例为空。)
4.修改获取实例的方法(在提供获取实例的方法中,做一个实例的判断,为空,创建一个实例,否则,直接获取实例)
两种模式的区别:
饿汉模式的特点时在加载类时比较快,但运行时获取对象速度比较快(线程安全)
懒汉模式的特点时在加载类时比较慢,但运行时获取对象速度比较慢(线程不安全)
问题:为什么说懒汉模式是线程不安全的?
解决方法:有多个线程同时进入 if (singleton2 == null) {…} 语句块的情形发生。当这种这种情形发生后,该单例类就会创建出多个实例,违背单例模式的初衷。此刻可以在将方法体使用synchronized进行修饰.