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 }