Java中的单例模式是一种设计模式,它限制一个类只能创建一个实例,并提供全局访问点,以确保所有对象共享同一份资源。单例模式在许多场景下非常有用,比如管理资源(如数据库连接池)、实现缓存、配置信息类以及控制类等。 1. **饿汉式**: 饿汉式单例在类加载时就创建了实例,所以它是线程安全的。这种方式确保了在多线程环境下也能正确地初始化实例,但可能会造成资源的浪费,因为即使单例未被使用,也会被提前实例化。 ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 2. **懒汉式**: 懒汉式单例在首次调用 `getInstance` 方法时才创建实例,实现了延迟初始化。但原始的懒汉式是线程不安全的,因为在多线程环境下,可能会创建多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 3. **懒汉式(双重检查锁定)**: 双重检查锁定解决了懒汉式的线程安全问题。它在多线程环境中确保只有一个实例被创建,同时避免了不必要的同步开销。双重检查锁定的关键在于使用 `volatile` 关键字,保证了多线程环境下的可见性和有序性。 ```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; } } ``` 4. **内部类单例**: 内部类单例使用类加载机制来保证单例的唯一性,因为类的加载是线程安全的。这种方式既实现了延迟初始化,又保证了线程安全。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 总结来说,Java中的单例模式有多种实现方式,每种方式都有其适用的场景和优缺点。饿汉式简单且线程安全,但可能导致资源浪费;懒汉式延迟初始化但线程不安全;双重检查锁定解决了线程安全问题但增加了代码复杂性;内部类单例结合了延迟初始化和线程安全性。选择哪种方式取决于具体的需求和性能考虑。
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