当前位置: 首页 > news >正文

单例模式(Java实现)

我的相关文章:

JavaSE 学习记录-CSDN博客
多线程笔记-CSDN博客
单例模式(Java实现)-CSDN博客
JUC笔记-CSDN博客
注解与反射(Java,类加载机制,双亲委派机制)-CSDN博客

1. 懒汉式线程不安全

public class LazyUnsafeSingleton {private static LazyUnsafeSingleton singleton;private LazyUnsafeSingleton(){}public static LazyUnsafeSingleton getInstance() {if (singleton == null) singleton = new LazyUnsafeSingleton();return singleton;}
}

2. 饿汉式(线程安全)

public class HungrySingleton {private static HungrySingleton singleton = new HungrySingleton();private HungrySingleton(){}public static HungrySingleton getInstance() {return singleton;}
}

3. 懒汉式线程安全

volatile
synchronized

public class LazySafeSingleton {private static volatile LazySafeSingleton singleton;private LazySafeSingleton(){}public static synchronized LazySafeSingleton getInstance() {if (singleton == null) singleton = new LazySafeSingleton();return singleton;}
}

4. 双重检查锁

public class DoubleCheckedLockSingleton {private static volatile DoubleCheckedLockSingleton singleton;private DoubleCheckedLockSingleton(){}public static DoubleCheckedLockSingleton getInstance() {if (singleton == null) {synchronized (DoubleCheckedLockSingleton.class) {if (singleton == null) {singleton = new DoubleCheckedLockSingleton();}}}return singleton;}
}

5. 静态内部类

public class StaticInnerClassSingleton {private static StaticInnerClassSingleton singleton;private static class SingletonHolder {private static StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

6. 枚举类型

public enum EnumSingleton {SINGLETON;public String doSomeThing() {return "hello world";}
}

测试类

public class SingletonTest {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, InterruptedException {// 1. 懒汉式线程非安全LazyUnsafeSingleton lazyUnsafeSingleton = LazyUnsafeSingleton.getInstance();// 2. 饿汉式HungrySingleton hungrySingleton = HungrySingleton.getInstance();// 3. 懒汉式线程安全LazySafeSingleton lazySafeSingleton = LazySafeSingleton.getInstance();// 4. 双重检查锁DoubleCheckedLockSingleton doubleCheckedLockSingleton = DoubleCheckedLockSingleton.getInstance();// 5. 静态内部类StaticInnerClassSingleton staticInnerClassSingleton = StaticInnerClassSingleton.getInstance();// 6. 枚举类型EnumSingleton enumSingleton = EnumSingleton.SINGLETON;enumSingleton.doSomeThing();// 反射无法破坏枚举类型的单例模式Class<EnumSingleton> enumSingletonClass = EnumSingleton.class;
//        Constructor<EnumSingleton> declaredConstructor = enumSingletonClass.getDeclaredConstructor();Constructor<?> declaredConstructor = enumSingletonClass.getDeclaredConstructors()[0];declaredConstructor.setAccessible(true);Object enumSingleton1 = declaredConstructor.newInstance(); // java.lang.IllegalArgumentException// 7. 反射破坏非枚举类型的单例模式// (1)获取 Singleton 类的 Class 对象Class<LazyUnsafeSingleton> lazyUnsafeSingletonClass = LazyUnsafeSingleton.class;// (2)获取 Singleton 类的私有构造函数Constructor<LazyUnsafeSingleton> constructor = lazyUnsafeSingletonClass.getDeclaredConstructor();// (3)设置私有构造函数的可访问性constructor.setAccessible(true);// (4)使用私有构造函数创建新的实例LazyUnsafeSingleton lazyUnsafeSingletonFromReflect = constructor.newInstance();// 打印新创建的实例和原始实例是否相等System.out.println("Original Instance: " + LazyUnsafeSingleton.getInstance());System.out.println("New Instance: " + lazyUnsafeSingletonFromReflect);System.out.println("Are instances equal? " + (LazyUnsafeSingleton.getInstance() == lazyUnsafeSingletonFromReflect));}
}
http://www.lryc.cn/news/361995.html

相关文章:

  • 24.面向对象六大原则
  • Vue3-shallowRef与shallowReactive
  • CI/CD(基于ESP-IDF)
  • 聚观早报 | 东风奕派eπ008将上市;苹果Vision Pro发布会
  • k8s牛客面经篇
  • 第9周 基于MinIO与OSS实现分布式与云存储
  • 【Linux内核-编程指南】
  • Go 编程风格指南 - 最佳实践
  • awk的应用
  • 【网络原理】HTTP|认识请求“报头“|Host|Content-Length|Content-Type|UA|Referer|Cookie
  • 深入React Hoooks:从基础到自定义 Hooks
  • 9.7 Go语言入门(映射 Map)
  • 过期视频怎么恢复?如何从手机、电脑和其他设备中恢复?
  • LeetCode刷题第2题
  • mysql执行拼接的sql语句
  • 使用 pm2 或 screen 等工具来管理和后台运行你的 Node.js 应用
  • leetcode4 寻找两个正序数组的中位数
  • 水库大坝安全监测系统建设方案
  • 单片机的内存映射和重映射
  • 详解和实现数据表格中的行数据合并功能
  • 深度学习-05-反向传播理论知识
  • 黑马程序员——Spring框架——day04——SpringMVC基础
  • SpaceX间接「颠覆」了手机?星链如何直连手机通信?
  • 初识C++ · 模拟实现stack和Queue
  • MFC工控项目实例之一主菜单制作
  • JVMの堆、栈内存存储
  • 二叉树—堆(C语言实现)
  • 儿童有声挂图的芯片AD156—云信通讯
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.25-2024.05.01
  • gdb调试常见指令