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 }

 

posted @ 2021-08-29 16:56  Saturn5  阅读(22)  评论(0)    收藏  举报