从单例谈double-check必要性,多种单例各取所需.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
【单例模式】是软件设计模式中非常基础且常用的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。单例模式分为多种实现方式,包括【饿汉式】和【懒汉式】,每种方式都有其适用场景和优缺点。 1. **饿汉式**单例: - 饿汉式单例在类加载时就完成了实例化,无论类是否被使用,都会立即创建对象,因此是线程安全的。在Java中,常量的初始化是在类加载时完成的,所以饿汉式单例可以保证在多线程环境下的安全性。 - 代码示例: ```java public class SingleFactory { private static final Person person = new Person(); private SingleFactory() {} public static Person getInstance() { return person; } } ``` - 饿汉式优点:线程安全,无同步开销,效率高,但可能导致资源浪费,因为即使未使用,对象也会被创建。 2. **变形的饿汉式**: - 将实例化过程放在静态代码块中,效果与直接实例化常量相同,都是在类加载时完成初始化。 - 代码示例: ```java public class SingleFactory { private static Person person; static { person = new Person(); } private SingleFactory() {} public static Person getInstance() { return person; } } ``` - 这种方式依然线程安全,但在JVM启动时延迟了常量的初始化时间,但整体效果与原始饿汉式相似。 3. **懒汉式**单例: - 懒汉式单例在第一次调用`getInstance`方法时才进行实例化,延迟了对象的创建,节省了内存,但可能影响多线程环境下的安全性。 - 代码示例(非线程安全): ```java public class SingleFactory { private static Person person = null; private SingleFactory() {} public static Person getInstance() { if(person == null) { synchronized(SingleFactory.class) { if(person == null) { person = new Person(); } } } return person; } } ``` - 懒汉式分为线程不安全和线程安全两种,线程不安全的懒汉式在多线程环境下可能导致多个实例的创建。为解决此问题,通常会使用双重检查锁定(Double-Check Locking),在上述代码中添加了同步机制,保证了线程安全。 4. **双检锁/双重检查锁定(DCL)**: - 在懒汉式的基础上,通过两次检查`person`是否为null来减少不必要的同步开销,提高性能。首次检查是为了避免不必要的同步,第二次检查是在同步块中进行,以确保只有一个线程能创建实例。 - DCL实现懒汉式单例在Java中需要考虑volatile关键字,以确保多线程环境下变量的可见性和有序性。 5. **静态内部类单例**: - 利用Java类加载机制保证单例的唯一性,同时避免了同步开销,兼顾了延迟初始化和线程安全。 - 代码示例: ```java public class SingleFactory { private static class SingletonHolder { private static final Person person = new Person(); } private SingleFactory() {} public static Person getInstance() { return SingletonHolder.person; } } ``` - 当外部类首次被加载时,内部类并不会被加载,直到`getInstance`方法被调用,此时内部类才会被加载并创建实例。 6. **枚举单例**: - 使用Java枚举类型实现单例,既简单又线程安全,还能防止反序列化重新创建实例。 - 代码示例: ```java public enum SingleFactory { INSTANCE; public Person getInstance() { return new Person(); } } ``` 总结来说,选择哪种单例模式取决于项目的需求,如是否需要延迟初始化、是否考虑线程安全、以及性能和简洁性的平衡。对于性能敏感的系统,可能需要更精细地权衡各种实现方式的优缺点。在实际开发中,根据具体场景选择合适的单例模式是至关重要的。
- 粉丝: 1
- 资源: 2837
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助