网站建设的整体流程有哪些?,兰州模板网站建设,郑州网站建设创业,微信公众号怎么创建桌面快捷方式系列文章目录
设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式#xff0c;5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式#xff0c;每一种模式的概念、使用…系列文章目录
设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式每一种模式的概念、使用场景和优缺点。 设计模式之模板方法模式通俗易懂快速理解以及模板方法模式的使用场景 设计模式之-建造者模式通俗易懂理解以及建造者模式的使用场景和示列代码 设计模式之-代理模式快速掌握理解代理模式以及代理模式的使用场景 设计模式之-原型模式快速掌握原型模式通俗易懂的理解原型模式以及使用场景 设计模式之-中介者模式快速掌握中介者模式通俗易懂的讲解中介者模式以及它的使用场景 设计模式之-责任链模式快速掌握责任链模式通俗易懂的讲解责任链模式以及它的使用场景 设计模式之-装饰模式快速掌握装饰模式通俗易懂的讲解装饰模式以及它的使用场景 系列文章目录
设计模式-6大设计模式通俗易懂快速掌握 文章目录 系列文章目录系列文章目录前言一、单列模式有哪几种实现以及它们的优缺点懒汉式Lazy Initialization饿汉式Eager Initialization双重检查锁定Double-Checked Locking静态内部类Static Inner Class枚举实现 二、示列代码懒汉式Lazy Initialization饿汉式Eager Initialization双重检查锁定Double-Checked Locking静态内部类Static Inner Class枚举实现 三、适用场景懒汉式Lazy Initialization饿汉式Eager Initialization双重检查锁定Double-Checked Locking静态内部类Static Inner Class枚举实现 总结 前言
谈到单例设计模式时以下是几种常见的实现方式。以及它们的优缺点
一、单列模式有哪几种实现以及它们的优缺点
懒汉式Lazy Initialization
优点实现简单只有在需要时才会创建实例。 缺点在多线程环境下存在线程安全问题。需要使用 synchronized 关键字保证线程安全但会带来性能上的开销。
饿汉式Eager Initialization
优点实现简单线程安全不存在多线程竞争的问题。 缺点在程序启动时就创建实例无论是否需要可能会带来一定的资源浪费。
双重检查锁定Double-Checked Locking
优点实现了懒加载和线程安全同时避免了每次都需要获取锁的性能开销。 缺点需要使用 volatile 关键字确保多线程环境下的可见性实现稍微复杂。
静态内部类Static Inner Class
优点实现了懒加载和线程安全同时具有较高的性能和可读性。利用类加载机制保证了线程安全性。 缺点无法在实例化时传递参数适用于无需传参的场景。
枚举实现
优点 线程安全枚举实例在多线程环境下也是唯一的不需要担心线程安全问题。 简洁明了使用枚举实现单例非常简单代码量少。 缺点 无法延迟加载枚举实例在类加载时就被实例化无法实现延迟加载的特性。 无法传递参数枚举实例无法在实例化时传递参数适用于无需传参的场景。 使用场景因此使用枚举实现单例模式适合于简单的单例对象且希望获得简洁的线程安全代码的情况。如果需要延迟加载或传递参数其他实现方式可能更合适。
二、示列代码
懒汉式Lazy Initialization
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有构造函数}public static synchronized LazySingleton getInstance() {if (instance null) {instance new LazySingleton();}return instance;}
}饿汉式Eager Initialization
public class EagerSingleton {private static final EagerSingleton instance new EagerSingleton();private EagerSingleton() {// 私有构造函数}public static EagerSingleton getInstance() {return instance;}
}双重检查锁定Double-Checked Locking
public class DoubleCheckedSingleton {private static volatile DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {// 私有构造函数}public static DoubleCheckedSingleton getInstance() {if (instance null) {synchronized (DoubleCheckedSingleton.class) {if (instance null) {instance new DoubleCheckedSingleton();}}}return instance;}
}静态内部类Static Inner Class
public class StaticInnerSingleton {private StaticInnerSingleton() {// 私有构造函数}private static class SingletonHolder {private static final StaticInnerSingleton instance new StaticInnerSingleton();}public static StaticInnerSingleton getInstance() {return SingletonHolder.instance;}
}枚举实现
public enum EnumSingleton {INSTANCE;// 可以在枚举中添加其他成员变量和方法public void doSomething() {// 单例的操作逻辑}
}三、适用场景
不同的单例实现方式适用于不同的场景。以下是对上述几种单例实现方式适用场景的简要总结
懒汉式Lazy Initialization
适用场景在需要延迟加载单例实例的情况下且对线程安全性要求不是特别高的场景。单线程环境或者有额外的同步措施保证线程安全时可以考虑使用。
饿汉式Eager Initialization
适用场景在程序启动时就需要创建单例实例并且对线程安全性要求较高的场景。适合于单例对象较小且占用资源较少的情况。
双重检查锁定Double-Checked Locking
适用场景在需要延迟加载单例实例的情况下对线程安全性要求较高并且希望在多线程环境下获取单例实例时具有较好的性能。适合于单例对象较大或者创建过程较为复杂的情况。
静态内部类Static Inner Class
适用场景在需要延迟加载单例实例的情况下对线程安全性要求较高并且希望使用简洁、清晰的代码实现。适合于单例对象较小且占用资源较少的情况。
枚举实现
适用场景在需要简洁、线程安全的单例实现并且不需要延迟加载和传递参数的情况下。适合于单例对象较小且占用资源较少的情况。
总结
需要根据具体的需求和场景来选择适合的单例实现方式。考虑到线程安全性、延迟加载、性能以及代码的简洁程度等因素选择最合适的单例实现方式对于保证应用的正确性和性能是很重要的。