-
何为单例模式
- 保证在整个软件的系统中,对整个类只能存在一个对象实例,并且提供一个取得该对象的方法(一般是静态)
-
有多种方式实现
-
静态常量饿汉式
- 构造器私有化
- 本类内部创建对象实例(final static)
- 提供一个公有的静态方法,返回对象实例
- 优点: 简单,在类加载的时候就完成实例化,避免了线程同步问题
- 缺点: 没有实现懒加载,可能造成未使用,但已经加载了,则造成内存浪费
-
静态代码块饿汉式
- 和上面那个没什么区别。。。还不如上面呢,代码行数增加了,国企狂喜
-
线程不安全的懒汉式
- 很明显,确实是用到了才创建
- 但是线程及其不安全,两个线程可能会重复实例化instance变量
- 绝对不能使用这种哦
-
线程安全的懒汉式
-
通过加锁来解决
-
但是锁的粒度太粗了,性能捉急
-
同步代码块的懒汉式
-
同样的,达不到线程安全的,两个线程同时到达锁,则会导致重复实例化
-
双重检查
-
使用volatile可以来禁止指令重排序
-
然后双重锁机制保证了线程安全,也保证了效率
-
静态内部类
-
静态内部类的特点:
- 当前类加载时,静态内部类不会被加载 (实现懒加载)
- 当我们用到了静态内部类的方法时,才会被加载,而加载时,线程是安全的,只会加载一次(不用担心)
-
所以使用静态内部类,可以实现懒加载,且保证线程安全,且保证效率
-
枚举
- 还挺好,是effective java作者推荐的方式
- 能够防止反序列化
-
总结
- 饿汉式的前两种,和后面三种都是可以用的,结合具体场景来用
- 尤其要考虑线程安全,然后要考虑效率,还有是否浪费内存空间