单例模式

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 }
原文地址:https://www.cnblogs.com/spring-effort/p/11553443.html