Java设计模式学习笔记——单例模式
懒汉模式
1 package com; 2 3 public class LazySingletonTest { //懒加载 4 public static void main(String[] args) { 5 LazySingleton inst1 = LazySingleton.getInstance(); 6 LazySingleton inst2 = LazySingleton.getInstance(); 7 System.out.println(inst1 == inst2); 8 } 9 } 10 11 class LazySingleton{ 12 private static volatile LazySingleton instance; //防止多线程时指令重排带来的一致性问题 13 private LazySingleton(){ 14 15 } 16 17 public static LazySingleton getInstance() { 18 if(instance==null){ 19 synchronized (LazySingleton.class) { // 防止多线程同时访问 20 if(instance==null) // 第二次检查 21 instance = new LazySingleton(); 22 } 23 } 24 return instance; 25 } 26 }
饿汉模式
1 public class HungrySingletonTest { 2 public static void main(String[] args) { 3 HungrySingleton inst1 = HungrySingleton.getInstance(); 4 HungrySingleton inst2 = HungrySingleton.getInstance(); 5 System.out.println(inst1 == inst2); 6 } 7 } 8 9 class HungrySingleton{ 10 private static HungrySingleton instance = new HungrySingleton(); 11 private HungrySingleton(){ 12 } 13 14 public static HungrySingleton getInstance(){ 15 return instance; 16 } 17 }
静态内部类方式
1 public class InnerClassSingletonTest { 2 public static void main(String[] args) { 3 InnerClassSingleton inst1 = InnerClassSingleton.getInstance(); 4 InnerClassSingleton inst2 = InnerClassSingleton.getInstance(); 5 System.out.println(inst1 == inst2); 6 } 7 } 8 9 class InnerClassSingleton { 10 private static class InnerClassHolder{ 11 private static InnerClassSingleton instance = new InnerClassSingleton(); 12 } 13 private InnerClassSingleton(){ 14 15 } 16 public static InnerClassSingleton getInstance(){ 17 return InnerClassHolder.instance; 18 //只有在实际使用的时候才会触发类的初始化,所以也是懒加载的一种形式 19 //但是利用了类的加载机制保证了线程安全 20 } 21 }
枚举方式 (线程安全且不支持反射创建实例)
1 public enum EnumSingleton { 2 INSTANCE; 3 public void print(){ 4 System.out.println(this.hashCode()); 5 } 6 } 7 8 class EnumTest{ 9 public static void main(String[] args) { 10 EnumSingleton inst1 = EnumSingleton.INSTANCE; 11 EnumSingleton inst2 = EnumSingleton.INSTANCE; 12 System.out.println(inst1 == inst2); 13 } 14 }