Java单例模式深度解析:四种实现方式

4星 · 超过85%的资源 需积分: 9 8 下载量 179 浏览量 更新于2024-09-18 收藏 2KB TXT 举报
"本文主要介绍了单例模式的概念和四种实现方式,包括饿汉式、懒汉式、双重检查锁定和静态内部类的方式。" 单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于管理共享资源,如数据库连接池、线程池或配置对象等,以提高系统效率并减少不必要的资源消耗。 1. 饿汉式(静态常量): 这是最简单的单例实现,类加载时就完成了实例化,确保了线程安全。代码中的`S1`就是饿汉式的例子。这种方式在类加载时就创建了单例对象,虽然实现了线程安全,但可能会浪费内存,因为即使没有使用,单例也会被创建。 ```java class S1 { private S1() { System.out.println("ok1"); } private static final S1 instance = new S1(); public static S1 getInstance() { return instance; } } ``` 2. 懒汉式(线程不安全): 在懒汉式中,单例对象在第一次调用`getInstance()`方法时才创建。这种方式延迟了实例化,但当多个线程同时调用`getInstance()`时,可能会创建多个实例,不符合单例的要求。代码中的`S2`是懒汉式的例子,它未考虑线程安全性。 ```java class S2 { private S2() { System.out.println("ok2"); } private static S2 instance = null; public static synchronized S2 getInstance() { if (instance == null) { instance = new S2(); } return instance; } } ``` 3. 双重检查锁定(DCL,线程安全): 为了弥补懒汉式的线程安全问题,引入了双重检查锁定。首先检查实例是否已经创建,如果未创建,再进行同步创建。这样既延迟了实例化,又保证了线程安全。代码中的`S3`是DCL的例子。 ```java class S3 { private S3() { System.out.println("ok3"); } private static S3 instance = null; public static S3 getInstance() { if (instance == null) { synchronized (S3.class) { if (instance == null) { instance = new S3(); } } } return instance; } } ``` 4. 静态内部类(线程安全): 利用Java类加载机制保证了线程安全,同时也延迟了实例化。代码中的`S4`使用了静态内部类的方式实现单例。 ```java class S4 { private S4() { System.out.println("ok4"); } private static class S4Holder { static S4 instance = new S4(); } public static S4 getInstance() { return S4Holder.instance; } } ``` 总结来说,单例模式在Java中有多种实现方式,每种方式都有其特点和适用场景。饿汉式适用于对性能要求较高且单例在程序生命周期内一直存在的场景;懒汉式适合对资源初始化有延迟需求的情况,但需要保证线程安全;双重检查锁定在延迟初始化和线程安全之间找到了平衡;静态内部类的方式则是兼顾了延迟初始化和线程安全,同时避免了同步开销,是推荐的实现方式。