Java设计模式单例模式(Singleton)用法解析 java设计模式单例模式(Singleton)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局反访问点。单例模式是创建型模式。单例模式在生活中应用也很广泛,比如公司CEO只有一个,部门经理只有一个等。JAVA中ServletCOntext,ServetContextCOnfig等,还有spring中ApplicationContext应用上下文对象,SessionFactory,数据库连接池对象等。使用单例模式可以将其常驻于内存,可以节约更多资源。 单例模式的应用场景: * CEO、部门经理等 * JAVA中ServletCOntext,ServetContextCOnfig等 * Spring中ApplicationContext应用上下文对象,SessionFactory,数据库连接池对象等 单例模式的实现方式有多种,常见的有懒汉式、恶汉式、静态内部类等。 懒汉式(线程不安全): 懒汉式单例模式的实现方式是提供一个静态对象instance,构造函数私有化防止外部创建对象,提供一个静态的getInstance方法来给访问者一个单例对象。这种写法的缺点就是没有考虑到线程安全问题,当多个访问者同时访问的时候很有可能创建多个对象。 懒汉式(线程安全): 懒汉式单例模式的实现方式是在第一种基础上添加了synchronized关键字保证了线程安全。这种写法在并发高的时候虽然保证了线程安全,但是效率很低,高并发的时候所有访问的线程都要排队等待。 恶汉式(线程安全): 恶汉式单例模式的实现方式是直接在运行(加载)这个类的时候创建了对象,之后直接访问。显然这种方式没有起到Lazy loading的效果。但是是线程安全的,实际开发中还是比较常用。 静态内部类(线程安全): 静态内部类单例模式的实现方式是提供一个私有的构造函数,防止外部创建对象,并提供一个静态的getInstance方法来给访问者一个单例对象。这种方式是线程安全的,并且效率高,实际开发中也比较常用。 单例模式是创建型模式,能够确保一个类在任何情况下都绝对只有一个实例,并提供一个全局反访问点。单例模式在生活中应用也很广泛,JAVA中也有许多应用。
2026-04-17 12:44:54 81KB java 设计模式 单例模式 Singleton
1
Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java中,有五种常见的单例实现模式,每种都有其特定的优点和适用场景。下面将详细介绍这些模式。 1. **饿汉式**: 这是最简单的单例实现方式,它在类加载时就创建了单例对象,因此是线程安全的。饿汉式的优点在于调用效率高,因为对象已经预先创建,直接返回即可。然而,它的缺点是不能延时加载,即使单例未被使用,也会占用内存资源。 ```java public class ImageLoader { private static ImageLoader instance = new ImageLoader(); private ImageLoader() {} public static ImageLoader getInstance() { return instance; } } ``` 2. **懒汉式**: 懒汉式是在第一次调用`getInstance()`方法时才创建单例对象,实现了延时加载。然而,为了确保线程安全,通常采用`synchronized`关键字来同步方法,这会降低调用效率。 ```java public class SingletonDemo2 { private static SingletonDemo2 instance; private SingletonDemo2() {} public static synchronized SingletonDemo2 getInstance() { if (instance == null) { instance = new SingletonDemo2(); } return instance; } } ``` 3. **静态内部类实现模式**: 这种方式结合了饿汉式的线程安全和延迟加载的优点。静态内部类不会在主类加载时立即加载,只有当调用`getInstance()`方法时才会加载,因此实现了延迟加载。同时,由于类加载机制,它是线程安全的。 ```java public class SingletonDemo3 { private static class SingletonClassInstance { private static final SingletonDemo3 instance = new SingletonDemo3(); } private SingletonDemo3() {} public static SingletonDemo3 getInstance() { return SingletonClassInstance.instance; } } ``` 4. **枚举类实现**: 使用枚举实现单例是最安全且高效的,因为枚举是天然线程安全的,并且可以防止反射和反序列化攻击。然而,枚举类不能实现延时加载。 ```java public enum SingletonDemo4 { INSTANCE; public void singletonOperation() { } } ``` 5. **Double Check Locking(DCL)**: DCL实现尝试解决懒汉式在多线程环境下的性能问题。它使用双重检查锁定,即在实例化对象前进行两次检查,以确保只创建一个实例。但由于JVM的指令重排序问题,可能会导致非线程安全的情况,因此不建议使用。 ```java public class SingletonDemo5 { private volatile static SingletonDemo5 instance; private SingletonDemo5() {} public static SingletonDemo5 getInstance() { if (instance == null) { synchronized (SingletonDemo5.class) { if (instance == null) { instance = new SingletonDemo5(); } } } return instance; } } ``` 在选择单例实现模式时,应考虑是否需要延时加载、线程安全性和调用效率。如果对象资源占用较少,且不需要延时加载,枚举是最佳选择。如果需要延时加载,静态内部类优于懒汉式,因为它更高效。而DCL由于其潜在问题,一般不推荐使用。了解并根据实际需求选择合适的单例实现方式对于优化代码性能和维护性至关重要。
2026-04-17 12:15:50 54KB java
1
单例模式是软件设计模式中的一种,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Java中,由于语言特性,实现单例模式有多种方式,每种方式都有其优缺点。以下是Java中7种常见的单例模式实现方式的详细说明: 1. **懒汉式(线程不安全)**: 这是最直观的实现,但不是线程安全的。在多线程环境中,可能导致多个实例的创建。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 2. **懒汉式(线程安全,同步方法)**: 使用`synchronized`关键字确保了线程安全,但每次调用`getInstance()`都会进行同步,降低了效率。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 3. **饿汉式**: 在类加载时就初始化实例,确保了线程安全,但失去了懒加载的优点。 ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 4. **饿汉式(变种)**: 类似于第三种,但在静态块中初始化,同样在类加载时完成实例化。 ```java public class Singleton { private static Singleton instance = null; private Singleton() {} static { instance = new Singleton(); } public static Singleton getInstance() { return instance; } } ``` 5. **静态内部类**: 利用类加载机制保证线程安全,只有在调用`getInstance()`时才加载内部类,实现了延迟加载。 ```java public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 6. **双重检查锁定(DCL,Double-Checked Locking)**: 在多线程环境下兼顾了线程安全和懒加载,是推荐的实现方式。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 7. **枚举**: 通过枚举方式实现单例,既简单又线程安全,同时防止反射攻击。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 每种实现方式都有其适用场景。例如,如果初始化过程非常耗时或资源密集,可能需要选择懒加载的方式;而在性能要求较高的系统中,可能会选择饿汉式或枚举方式。了解并掌握这些实现方式,可以帮助开发者根据实际需求选择最适合的单例模式实现。
1
Java之单例设计模式示例详解 Java之单例设计模式是软件开发中常用的设计模式之一,它可以保证一个类在内存中只能有一个对象。单例设计模式的实现有多种方式,本文将通过示例代码详细介绍饿汉式和懒汉式两种实现方式。 单例设计模式的思路 单例设计模式的思路可以总结为以下三个步骤: 1. 不让其他程序用new创建该类对象,以控制对象的个数。 2. 该类在自己内部创建一个对象,以便其他程序可以获取和使用。 3. 该类将创建的对象对外提供,让其他程序获取并使用。 饿汉式 饿汉式是单例设计模式的一种实现方式,它是一种空间换时间的方法。饿汉式的实现思路是,一上来我就把对象给你new好了,你来了直接就可以拿去“吃”了。 示例代码: ```java public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 懒汉式 懒汉式是单例设计模式的一种实现方式,它是一种时间换空间的方法。懒汉式的实现思路是一开始我就不给你new对象,你来找我,我在给你创建一个对象。 示例代码: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 懒汉式的缺点 懒汉式有一些缺点,例如,在多线程中使用的时候,可能会创建多个实例对象。如果线程1来调用getInstance()方法,判断了s==null,然后线程1由于未知的原因阻塞了,线程2再来调用getInstance()方法,判断s==null,线程2就创建了一个对象,这时候线程1又运行了,那么线程1就会创建一个对象~这样就会造成多个对象~ 懒汉式的线程优化 为了解决懒汉式的缺点,可以使用加锁的方法来优化懒汉式。 示例代码: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 饿汉式和懒汉式的区别 饿汉式和懒汉式的主要区别在于: 1. 饿汉式是空间换时间,懒汉式是时间换空间。 2. 在多线程访问的时候,懒汉式可能会创建多个对象,而饿汉式不会。 单例设计模式可以保证一个类在内存中只能有一个对象,是软件开发中常用的设计模式之一。本文通过示例代码详细介绍了饿汉式和懒汉式两种实现方式,希望能够帮助读者更好地理解和应用单例设计模式。
2026-04-17 11:18:13 70KB Java 单例设计模式
1
Java中的单例模式是一种设计模式,它限制一个类只能有一个实例。这种模式在软件工程中广泛应用,例如在配置管理、缓存管理、日志记录、对话框管理等场景。单例模式确保无论多少个线程访问,都只会有一个实例存在,从而避免资源的浪费和状态的混乱。 我们来看两种常见的单例实现方式:懒汉式和饿汉式。 1. **懒汉式**: 懒汉式实现的核心是延迟初始化,即在真正需要使用单例时才创建它。代码中,`Singleton`类的实例`instance`在类加载时初始化为`null`。`newInstance`方法检查`instance`是否为`null`,如果是,则创建一个新的`Singleton`实例。这种方法在多线程环境中存在竞态条件,可能导致多个线程同时创建`Singleton`实例,因此在并发环境下不是线程安全的。 2. **饿汉式**: 饿汉式则是在类加载时就创建了`Singleton`实例,确保在任何线程访问时,`instance`都已经准备好了。这样保证了线程安全,但可能会浪费资源,因为即使单例对象未被使用,也会被提前创建。 为了兼顾线程安全和延迟初始化,我们可以采用以下两种改进方式: 1. **静态内部类(或称为双重检查锁定)**: 这种方式结合了懒汉式和饿汉式的优势。`Singleton`类内部包含一个静态内部类`SingletonHolder`,`Singleton`实例在`SingletonHolder`类加载时创建。由于类加载是线程安全的,所以这种方法既保证了线程安全,又实现了延迟初始化。 ```java public class Singleton { private static class SingletonHolder { public static Singleton instance = new Singleton(); } private Singleton() {} public static Singleton newInstance() { return SingletonHolder.instance; } public void doSomething() { // do something... } } ``` 2. **枚举类型实现**: 这是另一种推荐的实现方式,它天然线程安全且防止反射攻击。通过将单例实例作为枚举类型的唯一元素,Java会保证枚举实例的唯一性。 ```java public enum Singleton { instance; public void doSomething() { // do something... } } ``` 总结一下,Java单例模式主要有懒汉式、饿汉式、静态内部类实现和枚举实现四种常见方式。懒汉式在多线程下需要额外的同步控制,饿汉式在类加载时就创建实例,静态内部类实现兼顾延迟初始化和线程安全,而枚举实现是最简洁且安全的方式。选择哪种实现方式取决于具体的应用场景和需求,如是否需要延迟初始化、对性能的要求以及是否担心反射攻击等。
2026-04-17 10:38:29 44KB 单例模式
1
Java单例模式详解 Java单例模式是Java编程中的一种设计模式,旨在保证一个类仅有一个实例,并提供一个全局访问点。下面我们将对9种Java单例模式进行详细的介绍。 单例模式的特点是: 1. 一个类只允许产生一个实例化对象。 2. 单例类构造方法私有化,不允许外部创建对象。 3. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象。 懒汉式(线程不安全) 懒汉式是单例模式的一种实现方式,其主要特点是单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading的效果。懒汉式的实现代码如下: ```java public class Singleton { private static Singleton singleton; private Singleton(){ } public static Singleton singleton(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } } ``` 懒汉式的缺点是未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题。 懒汉式(线程安全,同步方法,不推荐使用) 为了解决懒汉式的线程不安全问题,可以对getSingleton()方法进行同步加锁。但是,这种方法的缺点是效率低,大多数情况下这个锁占用的额外资源都浪费了,每个线程在想获得类的实例时候,执行getSingleton()方法都要进行同步。 ```java public class Singleton { private static Singleton singleton; private Singleton(){ } public static synchronized Singleton singleton(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } } ``` 饿汉式(线程安全) 饿汉式是单例模式的一种实现方式,其特点是在类加载时完成实例化对象的过程。饿汉式避免了线程同步问题,但是缺点是相比接下来的静态内部类而言,这种方法比静态内部类多了内存常驻,容易造成内存浪费,也未达到延迟加载的效果。 ```java public class Singleton{ private static Singleton singleton = new Singleton(); private Singleton(){ } public static Singleton singleton(){ return singleton; } } ``` 静态内部类加载(线程安全) 静态内部类加载是单例模式的一种实现方式,其特点是静态内部类不会在单例加载时加载,当调用getSingleton()方法时才会进行加载,达到类似懒汉式效果,并且也是线程安全的。 ```java public class Singleton{ private static Singleton singleton; private static class SingletonInner{ private static final Singleton instance = new Singleton(); } public static Singleton getSingleton(){ return SingletonInner.instance; } } ``` 枚举(线程安全) 枚举是Java单例模式的一种实现方式,其特点是自由串行化;保证只有一个实例;线程安全。Effective Java作者所提倡的方法,近乎完美,在继承场景下不适用。 ```java public enum Singleton { INSTANCE; } ``` Java单例模式有多种实现方式,每种方式都有其优缺点,选择哪种方式取决于实际需求和场景。
2026-04-17 09:53:24 70KB Java单例模式 Java单例模式详解
1
Java中的单例模式是一种设计模式,它限制一个类只能创建一个实例,并提供全局访问点。在Java中,有两种推荐的单例模式实现方式:双重检查锁定(Double-Checked Locking,DCL)模式和静态内部类模式。这两种模式都是为了在确保线程安全的同时,提高程序的性能。 1. 双重检查锁定模式: 在DCL模式中,我们使用`volatile`关键字和`synchronized`关键字来保证单例的正确初始化。关键代码如下: ```java public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } ``` - `volatile`关键字保证了`singleton`的可见性和防止指令重排序。在多线程环境下,它确保了当`singleton`被初始化后,所有线程都能看到初始化后的值,避免出现未初始化的对象被访问的情况。 - `synchronized`关键字确保了线程安全,防止多个线程同时进入`singleton`的初始化过程。但是,通过双重检查减少了不必要的同步开销,只有在第一次检查到`singleton`为null时才进行同步,提高了性能。 2. 静态内部类模式: 这种模式利用了Java类加载机制的线程安全性。关键代码如下: ```java public class Singleton { private Singleton(){} public static Singleton getInstance(){ return Inner.instance; } private static class Inner{ private static final Singleton instance = new Singleton(); } } ``` - 静态内部类`Inner`在`Singleton`类被加载时不会被加载,只有当调用`getInstance()`方法时,`Inner`类才会被加载,因此实现了延迟初始化。 - 类加载过程是线程安全的,所以`Inner`类的初始化也是线程安全的,不需要额外的同步措施。这使得代码简洁且高效。 除了这两种推荐的模式,还有其他的单例实现方式,如懒汉模式和饿汉模式: - 懒汉模式:在多线程环境中不安全,因为它在类初始化时就创建了单例,没有延迟初始化。如果多个线程同时进入`getInstance()`方法,可能会创建多个实例。 ```java public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } ``` - 饿汉模式:在类加载时即完成了初始化,所以是线程安全的。但由于提前初始化,即使单例可能并未立即使用,也占用了内存资源。 ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } ``` 在涉及反射和序列化时,推荐使用枚举类型实现单例,因为枚举天生就是线程安全的,而且无法通过反射或序列化破坏单例。然而,由于题目中未提及这些场景,所以这里不再详述。选择哪种单例模式应根据具体的应用需求和性能考虑来决定。
1
"Java单例模式实现静态内部类方法示例" Java单例模式是软件设计模式中最基本和最常见的一种设计模式,也是最容易理解的一种设计模式。它的主要思想是确保某个类只有一个实例,并且提供一个全局访问点来访问该实例。 在Java中,单例模式可以通过多种方式实现,包括懒汉式、饿汉式、双重检查锁定和静态内部类方法等。今天,我们主要介绍了Java单例模式实现静态内部类方法示例,涉及构造函数私有化等相关内容。 单例模式的定义 单例模式是指确保某个类只有一个实例,并且提供一个全局访问点来访问该实例。这种模式可以确保在整个应用程序中只有一个实例,并且可以避免资源的浪费。 静态内部类实现单例模式 静态内部类实现单例模式是指在类的内部定义一个静态内部类,该内部类中包含一个静态的实例变量,并在该类的静态块中实例化该变量。外部类通过获取内部类的实例来实现单例模式。 例如,在下面的代码中,我们定义了一个静态内部类NestClass,该类中包含一个静态的实例变量instance,并在该类的静态块中实例化该变量。外部类SpecialSingleton通过获取NestClass的实例来实现单例模式。 ```java public class SpecialSingleton { // 静态内部类 private static class NestClass { private static SpecialSingleton instance; static { System.out.println("instance = new SingletonTest()"); instance = new SpecialSingleton(); } } // 不能直接new private SpecialSingleton() { System.out.println("private SingletonTest()"); } public static SpecialSingleton getInstance() { System.out.println("SingletonTest getInstance()"); return NestClass.instance; } } ``` 静态内部类实现单例模式的优点 静态内部类实现单例模式有很多优点,包括: * 它可以避免线程安全问题,因为静态内部类的实例化是在类加载时完成的,而不是在getInstance()方法中完成的。 * 它可以避免同步代码,因为静态内部类的实例化是在类加载时完成的,不存在线程安全问题。 * 它可以提高性能,因为静态内部类的实例化是在类加载时完成的,不需要每次调用getInstance()方法时实例化。 单例模式的应用 单例模式有很多应用场景,包括: * 数据库连接池:可以使用单例模式来实现数据库连接池,以确保整个应用程序中只有一个连接池实例。 * 配置文件读取:可以使用单例模式来实现配置文件读取,以确保整个应用程序中只有一个配置文件实例。 * 日志记录:可以使用单例模式来实现日志记录,以确保整个应用程序中只有一个日志记录实例。 单例模式是一种非常有用的设计模式,可以帮助我们编写更加简洁、灵活和可维护的代码。
2026-04-17 08:49:39 44KB java 静态内部类 java 单例模式
1
单例模式是软件设计模式中的一种基础模式,用于控制类的实例化过程,确保一个类在整个应用程序中只存在一个实例。在Java中,单例模式的实现方式主要有三种:懒汉式、饿汉式和登记式(也称为双重检查锁定模式)。这三种模式都是为了保证在多线程环境下也能正确地创建并返回唯一的类实例。 1. **饿汉式单例**: 饿汉式单例在类加载时就完成了实例化,因此是线程安全的。如示例中的`Singleton1`类所示,它在类初始化时已经自行实例化了一个`Singleton1`对象,并通过一个静态工厂方法`getInstance()`提供访问。这种方式的优点是实现简单,线程安全,缺点是在类加载时就创建了实例,如果实例不被使用,会造成资源的浪费。 2. **懒汉式单例**: 懒汉式单例在第一次被调用`getInstance()`方法时才进行实例化,如`Singleton2`类所示。这里使用了`synchronized`关键字来保证线程安全,即当多个线程同时调用`getInstance()`时,只有一个线程能进入该方法,其他线程需要等待。这种方式延迟了实例化的时间,但在高并发场景下,由于每个线程都需要进行同步,可能会影响性能。 3. **登记式/双重检查锁定模式**: 这种方式结合了饿汉式和懒汉式的优点,既延迟了实例化,又保证了线程安全。其核心思想是在实例化前进行两次检查,确保只有一个实例。在Java 5之后,可以使用`volatile`关键字来优化,避免不必要的同步,提高性能。这种模式在实际应用中更为常见,但这里未给出具体示例。 单例模式的主要特点包括: 1. **唯一性**:确保类只有一个实例。 2. **自给自足**:类自己负责创建自己的唯一实例。 3. **全局访问点**:类提供一个公共的静态方法,让其他对象获取这个唯一的实例。 单例模式的应用场景广泛,例如: - 系统配置类,如数据库连接池、缓存管理等。 - 日志服务,保证全系统只有一个日志记录器。 - 对象池,如数据库连接池、线程池,避免频繁创建和销毁对象带来的开销。 - 单例类代表一个硬件设备,如打印机、显卡驱动等,确保同一时间只有一个对象与其交互。 - 控制台对话框,确保应用程序中只有一个对话框。 在实现单例模式时,需要注意以下几点: - 使用`private`构造函数防止其他类实例化。 - 提供一个静态方法作为全局访问点。 - 考虑线程安全,尤其是在多线程环境中。 总结起来,Java中的单例模式是控制类实例化的重要手段,通过饿汉式、懒汉式或登记式等方式保证类的唯一实例,适用于需要全局共享资源的场景。在实际开发中,根据应用需求和性能要求选择合适的实现方式。
2026-04-17 08:31:15 56KB 单例模式
1
Java单例模式是一种设计模式,它旨在控制类的实例化过程,确保在整个应用程序中,同一类最多只有一个实例存在。这种模式常被用于管理共享资源,比如数据库连接池、线程池或者配置信息等,因为这些资源往往需要全局唯一且状态需要保持一致。 在Java中,实现单例模式主要有以下几种方式: 1. **饿汉式(静态常量)**: 这种方式在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,线程安全。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **懒汉式(线程不安全)**: 这种方式在类首次被调用时才初始化,但线程不安全。在多线程环境下可能会创建多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 3. **懒汉式(同步方法)**: 通过synchronized关键字保证了线程安全,但每次获取实例时都需要进行同步,性能较低。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 4. **双检锁/双重校验锁(DCL,推荐)**: 在多线程环境下既能保证线程安全,又可以避免同步带来的性能影响。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 5. **静态内部类**: 利用类加载机制保证初始化实例时只有一个线程,线程安全,且只在第一次加载时进行初始化,所以效率较高。 ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 6. **枚举**: 简洁且线程安全,但不常用,因为枚举主要用于定义常量。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 在给定的代码示例中,采用的是懒汉式的实现方式,但是它是线程不安全的。当多个线程同时调用`getInstance()`方法时,有可能创建多个`Emperor`实例。为了修复这个问题,可以将`getInstance()`方法改为同步方法,或者采用其他线程安全的单例实现方式。 此外,这个示例中的`Emperor`类有一个`getName()`方法,用于输出皇帝的名字。在实际应用中,这样的共享资源类可能会包含更复杂的业务逻辑或数据处理方法。 总结来说,Java单例模式通过限制类的实例化,保证了全局唯一性,有效地管理和复用了系统资源,提高了程序的效率。在实现单例模式时,需要注意线程安全问题,并选择适合的实现策略来平衡性能和安全性。
2026-04-16 23:44:07 49KB Java 单例模式
1