当前位置: 首页 > news >正文

上海网站建设方案企业的互联网推广

上海网站建设方案,企业的互联网推广,怎么做wap网站,大学生网站制作作业免费下载目录 单例模式的定义: 饿汉式--单例模式 定义: 案例: 优缺点: 懒汉式--单例模式: 定义: 1)懒汉式单例模式(非线程安全) 2)线程安全的懒汉式单例模…

目录

单例模式的定义:

饿汉式--单例模式

 定义:

案例: 

优缺点: 

懒汉式--单例模式:

定义:

1)懒汉式单例模式(非线程安全) 

2)线程安全的懒汉式单例模式 (synchronized )

3)双重检查锁定的懒汉式单例模式(线程安全) 


单例模式的定义:

  • 单例模式是一种设计模式,它确保一个类只有一个实例并提供一个全局访问点来访问这个实例。就好像在一个软件系统中,对于某些特定的资源或者对象,只需要一个就足够了,例如数据库连接池、配置文件管理器等。通过单例模式可以更好地控制这些对象的创建和访问,避免创建多个实例导致资源浪费或者数据不一致等问题。

单例模式能保证某个类在程序中只存在唯⼀⼀份实例,⽽不会创建出多个实例. 

要实现单例模式,通常需要做到以下几点

  1. 私有化构造函数,防止外部通过new关键字创建实例。
  2. 提供一个静态的私有变量来保存类的唯一实例。
  3. 提供一个公共的静态方法来获取类的唯一实例,如果实例不存在则创建它。

单例模式具体的实现⽅式有很多.最常⻅的是"饿汉"和"懒汉"两种.


饿汉式--单例模式

定义:

  • 在饿汉式单例模式中,“饿” 体现的是一种急切的状态。就好像一个很饿的人,在看到食物(这里类比于单例对象)的时候,会迫不及待地先把食物拿到手(创建单例对象)。在这个模式下,单例对象在类加载阶段就被创建出来,而不是等到真正需要使用这个对象的时候才去创建。这种方式比较急切,所以被称为 饿汉模式”。

案例: 

class Singleton {// 私有静态成员变量,在类加载时就初始化实例private static Singleton instance = new Singleton();// 私有构造函数,防止外部通过new关键字创建实例private Singleton() {}// 公共静态方法,用于获取单例实例public static Singleton getInstance() {return instance;}
}
- ** 类加载过程中的创建**
     - 在Java中,类加载是由类加载器(ClassLoader)完成的一个过程。当一个类被首次主动使用(例如创建这个类的实例、访问这个类的静态成员等情况)时,这个类就会被加载。对于上述的`Singleton`类,当`Singleton`类被加载时,`private static Singleton instance = new Singleton();`这行代码就会被执行。 因为类加载机制保证了一个类在一个Java程序中只会被加载一次(在正常情况下),所以`instance`对象也只会被创建一次
   - **访问控制保证单例性**
     - 构造函数`private Singleton()`是私有的。这是非常关键的一点,它防止了外部类通过`new`关键字来创建`Singleton`类的新实例。外部类只能通过`public static Singleton getInstance()`方法来获取单例对象,而这个方法每次返回的都是在类加载阶段就已经创建好的`instance`对象,从而保证了整个系统中 只有一个`Singleton`类的实例存在。

优缺点: 

**优点**
   1 **线程安全**
     - 由于单例对象是在类加载阶段就创建好的,而类加载过程在Java中是线程安全的(由Java虚拟机来保证)。所以在多线程环境下,这种方式可以保证多个线程访问`getInstance`方法时,获取到的都是同一个单例对象,不会出现多个线程创建多个实例的情况。
   2- **实现简单**
     - 从代码量和逻辑复杂度来看,饿汉式单例模式是比较简单的。只需要在类中定义一个私有静态变量并初始化,再提供一个公共静态方法来返回这个变量即可。这种简单的实现方式使得代码易于理解和维护。
**缺点**
   - **可能会造成资源浪费**
     - 如果单例对象的创建过程比较复杂,例如需要进行大量的初始化操作,如加载配置文件、建立网络连接等,并且这个单例对象在程序运行初期可能并不一定需要被使用。那么在类加载阶段就创建这个单例对象可能会导致资源的浪费。就好像提前准备了一顿丰盛的大餐(单例对象),但可能很长时间都没有人来吃(使用单例对象),而准备这顿大餐(创建单例对象)的过程又耗费了很多资源。


懒汉式--单例模式:

定义:

 在懒汉模式下,实例在第一次使用时才进行创建,因此称为“懒汉”,在需要被用的时候被创建,突出一个字“

1)懒汉式单例模式(非线程安全) 

public class LazySingleton {// 私有静态变量,用于存储单例对象private static LazySingleton instance;// 私有构造函数,防止外部通过new关键字创建新的实例private LazySingleton() {}// 公共的静态方法,用于获取单例对象public static LazySingleton getInstance() {if (instance == null) {// 如果实例还未创建,则创建一个新的实例instance = new LazySingleton();}return instance;}
}
  • 这种实现方式在单线程环境下是可以正常工作的。当第一次调用getInstance方法时,会检查instance是否为null。如果是null,就会创建一个LazySingleton类的实例并赋值给instance,然后返回这个实例。之后再调用getInstance方法时,因为instance已经不是null了,所以会直接返回已创建的实例。
  • 存在的问题
    • 在多线程环境下,这种实现方式是不安全的。假设两个线程同时调用getInstance方法,并且此时instancenull。这两个线程都会执行instance = new LazySingleton();这一行代码,从而创建出两个不同的LazySingleton实例,这就违背了单例模式的初衷。

2)线程安全的懒汉式单例模式 (synchronized )

public class ThreadSafeLazySingleton {private static ThreadSafeLazySingleton instance;private ThreadSafeLazySingleton() {}// 使用synchronized关键字修饰方法,保证在多线程环境下的线程安全public static synchronized ThreadSafeLazySingleton getInstance() {if (instance == null) {instance = new ThreadSafeLazySingleton();}return instance;}
}
  • 通过在getInstance方法上添加synchronized关键字,保证了在多线程环境下,同一时刻只有一个线程能够进入这个方法。当一个线程进入getInstance方法并发现instancenull时,它会创建一个新的实例。其他线程如果在这个时候也尝试调用getInstance方法,就会被阻塞,直到第一个线程完成实例的创建并返回。
  • 存在的问题
    • 这种方式虽然保证了线程安全,但是性能较差。因为每次调用getInstance方法都需要获取锁,即使实例已经创建完成,这种不必要的同步操作会在高并发场景下成为性能瓶颈。

3)双重检查锁定的懒汉式单例模式(线程安全) 

public class DoubleCheckedLockingSingleton {// 使用volatile关键字保证变量的可见性和禁止指令重排序private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {// 第一次检查,提高性能,避免不必要的同步操作synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {// 第二次检查,确保在同步块内也不会创建多个实例instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}
  • 首先,if (instance == null)这一检查在同步块外进行,这是第一次检查。如果instance已经不是null就可以直接返回实例,避免了进入同步块,从而提高了性能
  • 当第一次检查instancenull时,线程会进入同步块。在同步块内,又进行了一次if (instance == null)检查,这是第二次检查。这是为了防止在多个线程同时通过第一次检查后,只有一个线程能够进入同步块创建实例,其他线程在等待这个线程完成创建后,直接获取已创建的实例,而不会再次创建
  • 使用volatile关键字是非常关键的。在 Java 中,指令重排序可能会导致instance变量在没有完全初始化的情况下就被其他线程看到。volatile关键字可以保证变量的可见性,并且禁止指令重排序,确保了单例模式的正确性。

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力! 

http://www.dinnco.com/news/71169.html

相关文章:

  • 科技强国向秦始皇直播四大发明文明seo
  • 做学校网站素材2023年小学生简短小新闻
  • 苏州网站推广公司长沙网络推广网站制作
  • 怎么做网站客服弹窗青岛seo网络优化公司
  • 做网站的客户资料交换qq群手机百度如何发布作品
  • 如何联系网站站长谷歌seo工具
  • 做网站网页的公司seo整站优化技术培训
  • 有哪些可以做问卷赚钱的网站百度搜索页面
  • 吴忠北京网站建设seo英文怎么读
  • 商务网站模板下载指数计算器
  • 做网站mfdos湖南有实力seo优化
  • 网站建设需要客户提供什么内容线上广告投放渠道
  • 网站建设轮播大图百度收录在线提交
  • 兰州做网站的公司临沂seo代理商
  • phpweb手机版网站搜索关键词的网站
  • 公司做网站需要准备什么软件适合网络营销的产品
  • 网站在线客服哪个好甘肃网站推广
  • 郑州网站推广今日国家新闻
  • 陕西城乡住房建设厅网站外贸订单一般在哪个平台接
  • 网站开发职位工资重庆百度搜索优化
  • 网站怎样自己做推广搜索引擎优化的核心是
  • 桂林漓江旅游西安seo关键词查询
  • 有没有做公务员题的网站网店运营推广方案
  • 中英文免费网站建设深圳优化公司义高粱seo
  • 企业网站建设后期维护费用营销推广公司
  • 红花岗区住房和城乡建设局网站太原百度快速优化排名
  • java 网站开发 简历公司网站建设多少钱
  • 家具网站建设东莞市网络seo推广企业
  • 做网站用什么源码最好百度爱采购平台官网
  • 做怎样的网站能赚钱吗qq推广链接生成