设计模式面试题笔记
1. 单例模式有哪几种实现?如何保证线程安全? 首先,单例模式和工厂模式都是一种设计模式。单例模式当中,一个类只允许创建一个对象(或者说实例), 那这个类就是单例类。单例类是不可以被继承的,也没有了多态的特性。 【单例类的实现方式】 常规单例模式有五种写法,但是编写代码的过程当中,要注意以下几点: 构造器需要私有化 暴露一个公共获取单例对象的接口 (obj.getInstance()) 是否支持懒加载 延迟加载 是否线程安全 五种写法为: 饿汉式: 类加载的时候,就一起把 instance 静态实例创建好了,所以创建的过程市线程安全的。 饿汉式的单例模式虽然不支持懒加载,有点浪费资源。但其实不会占用太多资源,并且如果一个实例初始化的过程比较复杂,就应该放在启动的时候来处理,避免运行时卡顿或发生问题, 满足fail-fast 失败快速解决的设计原则 public class EagerSingleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 懒汉式:相较于饿汉式的方式,修改成延迟加载的模式。注意getInstance()方法没有上锁的话,在大量线程并发请求的时候,可能创建多个实例。 public class Singleton { private static Singleton instance; private Singleton (){} public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 双重检查锁:饿汉式锁不支持延迟加载,然后懒汉式锁的粒度比较大,不支持高并发。双重检查锁可以实现既延迟加载,又支持高并发。其实就是在判断了没有实例之后,再进行上锁,创建实例。 但是实例必须用volatile 修饰,不然new 操作创建对象时,容易出现重排序的问题。 ...