1. 饿汉模式:在加载类初始化的阶段进行创建。
  2. 饱汉模式:使用的时候才创建。

饿汉模式实现:

  1. public class Singleton{//实现一 利用JVM对类的解析。
  2. private Singleton(){}//构造函数私有化
  3. private static Singleton instance=new Singleton();
  4. public static Singleton getInstance(){return instance;}
  5. }
  6. public class Singleton{//实现二 利用静态内部类
  7. private static class InnerSingleton{
  8. private static Singleton instance=new Singleton();
  9. }
  10. private Singleton(){
  11. if(InnerSingleton.instance!=null)//防止反射创建对象。
  12. throw new RuntimeException("单例不能生成多个实例");
  13. }
  14. public static Singleton getInstance(){return InnerSingleton.instance;}
  15. }
  16. public enum Singleton{//实现三 利用枚举类型。枚举类型天然不允许反射创建。
  17. INSTANCE;
  18. public void print(){
  19. System.out.println(this.hashCode());
  20. }
  21. }
  22. public class Singleton{
  23. private static class InnerSingleton{
  24. private Singleton instance=new Singleton();
  25. }
  26. private Singleton(){
  27. if(InnerSingleton.instance!=null)
  28. throw new RuntimeException("单例不允许多个实例");
  29. }
  30. public static Singleton getInstance(){return InnerSingleton.instance;}
  31. Object readResolve()throws ObjectStreamException{//用于反序列化时调用。
  32. return InnerSingleton.instance;
  33. }
  34. }

饱汉模式:DoubleCheck

  1. @ThreadSafe
  2. public class Singleton{
  3. private volatile static instance;//volatile 这里主要是防止指令重排。
  4. private Singleton(){}
  5. public static Singleton getInstance(){
  6. if(instance==null){
  7. //可能有多个线程阻塞在此。
  8. synchronized(Singleton.class){
  9. //因为可能有多个线程拿到锁,所以需要再加一层判断。
  10. if(instance==null) instance=new Singleton();
  11. }
  12. }
  13. return instance;
  14. }
  15. }

饱汉模式:延迟初始化占位类模式(最佳)

  1. @ThreadSafe
  2. public class Singleton{
  3. private Singleton(){}
  4. private static class InnerSingleton{
  5. public static Singleton instance=new Singleton();
  6. }
  7. public static Singleton getInstance(){
  8. return InnerSingleton.instance;
  9. }
  10. }