1.单例模式:
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象创建。这个类提供一种访问方式访问其唯一的对象的方式,
可以直接访问,不需要实例化该类对象。
2.特点:
1.单例类只能有一个实例。
2.单例类必须自己创建自己的唯一实例。
3.单例类必须给所有其他对象提供这一实例。
3.实现方法:
许多人可能值记得懒汉式和饿汉式,但是最好尽可能全记住,不然面试官问你还有没有其他的那就哑然了。
(1)懒汉式:线程不安全,加锁会影响效率
- 1 public class LSingle {
- 2 private static LSingle single;
- 3 //私有的无参构造器一定要存在:不想用别人用new的方法创建对象
- 4 private LSingle() {}
- 5 //加锁解决线程不安全问题但是影响效率
- 6 public static /*synchronized*/ LSingle getSingle() {
- 7 if(single==null)single = new LSingle();
- 8 return single;
- 9 }
- 10
- 11 }
(2)饿汉式:线程安全,在类加载中初始化,浪费内存
- 1 public class ESingle {
- 2 private static ESingle single = new ESingle();
- 3 //必须存在私有构造器
- 4 private ESingle() {}
- 5 public static ESingle getSingle() {
- 6 return single;
- 7 }
- 8
- 9 }
(3)双重校验锁:采用双锁机制,安全且在多线程的情况下保持高性能,但是不易实现
- 1 public class DoubleLockSingle {
- 2 private static DoubleLockSingle single;
- 3 //必须存在私有构造器
- 4 private DoubleLockSingle() {}
- 5 public static DoubleLockSingle getSingle() {
- 6 if(single==null) {
- 7 synchronized(DoubleLockSingle.class) {
- 8 if(single==null) {
- 9 single = new DoubleLockSingle();
- 10 }
- 11 }
- 12 }
- 13 return single;
- 14 }
- 15
- 16 }
(4)静态内部类/登记式:线程安全,和双锁机制效果一样,实现更简单,只是有于静态域
- public class StaticSingle {
- private static class InnerSingle{
- //常量:直接调用
- private static final StaticSingle single = new StaticSingle();
- }
- public static StaticSingle getSingle() {
- return InnerSingle.single;
- }
- }
(5)枚举:线程安全,实现容易,是实现单例模式的最佳方法,支持自动系列化机制防止多次序列化,但是使用的少
- 1 //枚举类
- 2 public enum EnumSingle {
- 3 single;
- 4 public void whateverMethod() {
- 5 }
- 6 }