o2o网站做推广公司,php内容管理系统,网址查询ip解析,网址和域名目录 一、引言二、适用场景三、代码实战饿汉式单例模式懒汉式单例模式双重检查锁定单例模式静态内部类单例模式 四、实际应用举例Runtime解析 五、结论 一、引言 单例模式是一种创建型设计模式#xff0c;用于确保一个类只有一个实例#xff0c;且提供全局访问点以访问该实例… 目录 一、引言二、适用场景三、代码实战饿汉式单例模式懒汉式单例模式双重检查锁定单例模式静态内部类单例模式 四、实际应用举例Runtime解析 五、结论 一、引言 单例模式是一种创建型设计模式用于确保一个类只有一个实例且提供全局访问点以访问该实例。以下是单例模式的关键特点 私有构造函数单例类通常会将其构造函数声明为私有以防止外部直接创建实例。私有静态实例单例类通常会维护一个私有的静态实例变量用于保存唯一的实例。静态获取方法单例类通常提供一个静态的获取方法允许客户端代码访问单例实例。惰性初始化单例实例通常是在首次访问时初始化的以延迟实例化提高性能。线程安全单例模式通常需要考虑线程安全性以防止多个线程同时创建实例。 二、适用场景 单例模式适用于以下情况 全局资源访问当一个对象需要在系统中全局唯一访问时如配置管理、日志记录、数据库连接等。控制资源访问当需要限制某种资源如线程池、连接池、缓存的访问数量时。惰性初始化当对象的创建和初始化可能具有较高的开销但只在需要时才进行时。线程池用于创建线程池以便在整个应用程序中维护一个可管理的线程池实例。 三、代码实战
饿汉式单例模式
public class EagerSingleton {private static final EagerSingleton instance new EagerSingleton();private EagerSingleton() {// 私有构造函数}public static EagerSingleton getInstance() {return instance;}
}原理在类加载时即实例化前实例变量就已经被分配内存因此保证了线程安全。但可能会浪费内存因为不一定会使用该实例。 懒汉式单例模式
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有构造函数}public static synchronized LazySingleton getInstance() {if (instance null) {instance new LazySingleton();}return instance;}
}原理该实现使用惰性初始化只有在第一次调用 getInstance() 时才创建实例。通过加锁来确保线程安全但可能引发性能问题。 双重检查锁定单例模式
public class DoubleCheckedSingleton {private volatile static DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {// 私有构造函数}public static DoubleCheckedSingleton getInstance() {if (instance null) {synchronized (DoubleCheckedSingleton.class) {if (instance null) {instance new DoubleCheckedSingleton();}}}return instance;}
}原理通过双重检查确保只在第一次创建实例时使用同步锁提高了性能。 静态内部类单例模式
public class InnerStaticSingleton {private InnerStaticSingleton() {// 私有构造函数}private static class SingletonHolder {private static final InnerStaticSingleton instance new InnerStaticSingleton();}public static InnerStaticSingleton getInstance() {return SingletonHolder.instance;}
}原理利用Java类加载机制保证只有在首次访问 getInstance() 时才加载内部类并创建实例。 四、实际应用举例 Java开发工具包JDK中有一些类和模块使用了单例模式来管理资源或确保全局唯一性。以下是一些示例 Runtime类java.lang.Runtime类是Java的运行时系统入口它使用了饿汉式单例模式来确保在应用程序中只有一个运行时实例。你可以通过Runtime.getRuntime()方法获取运行时对象的唯一实例从而执行与运行时环境相关的操作。Calendar类java.util.Calendar类是用于日期和时间操作的抽象类它提供了一个getInstance()方法返回特定日历系统的单例实例。这是一个懒汉式单例模式的示例以确保只有一个日历实例。Desktop类java.awt.Desktop类用于与桌面操作系统进行交互如打开文件、浏览网页等。它使用了饿汉式单例模式来保证只有一个桌面对象的实例。 这些示例中的单例模式确保了全局唯一性并用于管理特定资源或提供全局访问点。虽然不是所有JDK中的类都使用单例模式但一些核心类确实使用了这种设计模式来确保一些特定的实例只存在一个。 Runtime解析 在 Java 的 Runtime 类中使用了饿汉式单例模式来确保在应用程序中只有一个运行时实例。以下是 Runtime 类的部分代码展示了如何使用单例模式来创建和返回运行时实例 public class Runtime {private static Runtime currentRuntime new Runtime();// 私有构造函数防止外部实例化private Runtime() {}// 获取当前运行时实例public static Runtime getRuntime() {return currentRuntime;}// ...其他方法和功能...
}解释 currentRuntime 是一个静态私有成员变量它在类加载时被初始化。这就是饿汉式单例模式的特点实例在类加载时就被创建而不是在首次访问时才创建。构造函数 private Runtime() 被声明为私有这意味着外部代码无法直接实例化 Runtime 类。getRuntime() 方法是一个静态方法用于获取当前运行时实例。它返回的是 currentRuntime 静态实例变量确保每次调用 getRuntime() 方法都返回同一个实例。 这种设计确保了在整个应用程序中只有一个运行时实例因为 currentRuntime 在类加载时就被创建并且构造函数是私有的外部代码无法创建新的实例。这是一种有效的方式以确保只有一个全局运行时环境以便执行与运行时环境相关的操作如执行外部进程、获取系统信息等。 五、结论 以下是单例模式的一些总结和结论 优点 全局唯一性单例模式确保一个类只有一个实例因此能够全局唯一地管理特定类型的资源或状态。惰性初始化单例实例通常是在首次访问时初始化的从而避免了不必要的资源浪费。全局访问点单例提供了一个全局访问点允许应用程序中的其他对象轻松访问单例实例。线程安全性合理实现的单例模式可以确保多线程环境下的线程安全性防止多次实例化。 缺点和注意事项 过度使用过度使用单例模式可能导致全局状态的滥用使代码难以维护和测试。应谨慎使用。不适用于所有情况并非所有类都适合作为单例有些类需要多个实例来独立处理不同任务。测试困难单例模式的全局状态共享可能会使单元测试变得复杂因此需要额外的努力来测试应用。多例模式在某些情况下可能需要多个实例而不仅仅是一个全局唯一实例。 总的来说单例模式是一种非常有用的设计模式用于确保一个类只有一个实例。它在管理全局资源、限制实例数量以及提供全局访问点等方面发挥了重要作用。然而在使用单例模式时应慎重考虑确保它真正符合应用程序的需求。此外要注意线程安全性和测试问题以确保单例实现的正确性。 点赞收藏富婆包养✋✋