河北专业网站建设公司推荐,兼职网站开发团队工作项目总结,wordpress 站内通知,上海外贸企业单例模式#xff08;Singleton#xff09;#xff1a;确保一个类只有一个实例#xff0c;并提供一个全局访问点。
单例模式两种实现方法#xff1a;懒汉式和饿汉式。
懒汉式#xff08;Lazy Initialization#xff09;
懒汉式单例模式在第一次被使用时才创建实例Singleton确保一个类只有一个实例并提供一个全局访问点。
单例模式两种实现方法懒汉式和饿汉式。
懒汉式Lazy Initialization
懒汉式单例模式在第一次被使用时才创建实例这种方式可以延迟对象的创建节省资源。
线程不安全实现
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}
这种实现方式在多线程环境下可能会出现问题因为两个线程可能同时检查到instance为null并尝试创建实例导致创建多个实例。
线程安全实现双重检查加锁
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;}
}
这里使用了volatile关键字和双重检查锁定机制来确保线程安全。
饿汉式Eager Initialization
饿汉式单例模式在类被加载时就创建实例这种方式保证了实例的唯一性并且在任何时候都能快速访问实例。
public class Singleton {private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
饿汉式实现简单并且是线程安全的因为实例在类加载时就已经创建好了不存在多线程访问的问题。
区别
实例创建时机懒汉式在第一次使用时创建实例而饿汉式在类加载时就创建实例。资源利用懒汉式可以延迟对象的创建节省资源而饿汉式不管是否使用都会创建实例可能会造成资源浪费。线程安全性饿汉式天然线程安全而懒汉式需要额外的处理来保证线程安全。性能懒汉式在第一次访问时需要进行同步操作可能会有性能损耗饿汉式则没有这个问题但需要承担实例始终占用内存的代价。
选择哪种方式取决于具体的需求和场景。如果实例化代价较大且不是经常使用懒汉式可能更合适如果实例化代价不大或者需要保证绝对的线程安全饿汉式可能更合适。