活动介绍

设计模式之Singleton 模式.docx

preview
需积分: 0 0 下载量 87 浏览量 更新于2012-03-28 收藏 20KB DOCX 举报
单例模式是软件设计模式中的一种,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置管理、线程池、缓存等场景,避免频繁创建和销毁对象带来的开销。 我们来看“饿汉模式”(Eager Initialization),这是实现单例模式的一种方式。在Java中,饿汉模式会立即创建单例对象,当类被加载到内存中时,`ourInstance`就会被初始化。这种做法保证了线程安全,因为在类加载时就已经完成了实例化,所以不存在并发问题。但是,它也存在缺点,即无论是否需要,单例对象都会在程序启动时就被创建,可能会造成资源浪费。 ```java public class EagerSingleton { private static EagerSingleton ourInstance = new EagerSingleton(); public static EagerSingleton getInstance() { return ourInstance; } private EagerSingleton() {} // 构造函数私有化,防止外部实例化 } ``` 接下来是“懒汉模式”(Lazy Initialization),它的核心思想是在真正需要使用单例时才进行实例化。这样可以节省资源,只有当第一次调用`getInstance()`时才会创建对象。然而,未加同步控制的懒汉模式在多线程环境下会出现问题,可能导致多个线程同时创建单例对象,违背了单例模式的设计初衷。为了解决这个问题,可以使用同步化(`synchronized`)关键字: ```java public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton() {} // 构造函数私有化 synchronized public static LazySingleton getInstance() { if(lazySingleton == null) { lazySingleton = new LazySingleton(); } return lazySingleton; } } ``` 在这个版本的懒汉模式中,`getInstance()`方法被声明为同步的,这样在多线程环境下,只有一个线程能进入该方法创建实例。虽然解决了线程安全问题,但同步操作会导致性能下降,因为每次获取实例时都需要进行同步,即使对象已经被创建。 为了兼顾性能和线程安全,可以采用双重检查锁定(Double-Checked Locking)模式: ```java public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instance; private DoubleCheckSingleton() {} public static DoubleCheckSingleton getInstance() { if (instance == null) { // 第一次检查 synchronized (DoubleCheckSingleton.class) { if (instance == null) { // 第二次检查 instance = new DoubleCheckSingleton(); } } } return instance; } } ``` 在这个模式下,只有在`instance`为`null`且需要创建实例时,才会进行同步操作,大大提高了效率。`volatile`关键字确保了多线程环境下的可见性和有序性,避免了指令重排序问题。 单例模式在Java中主要有饿汉模式、懒汉模式以及双重检查锁定模式等实现方式。每种方式都有其适用场景和优缺点,需要根据实际需求来选择合适的实现策略。在设计单例时,除了要考虑线程安全,还需要关注性能和代码的可读性。
身份认证 购VIP最低享 7 折!
30元优惠券