懒汉式

news/2024/11/23 3:23:41/


懒汉式单例懒汉式单例模式在第一次调用的时候进行实例化。
 

public class Singleton1 {private static Singleton1 instance = null;private Singleton1() {}/*** 1、适用于单线程环境(不推荐)*/public static Singleton1 getInstanceA() {if (null == instance) {instance = new Singleton1();}return instance;}/*** 2、适用于多线程环境,但效率不高(不推荐)*/public static synchronized Singleton1 getInstanceB() {if (instance == null) {instance = new Singleton1();}return instance;}/*** 3、双重检查加锁(推荐)*/public static Singleton1 getInstanceC() {// 先判断实例是否存在,若不存在再对类对象进行加锁处理if (instance == null) {synchronized (Singleton1.class) {if (instance == null) {instance = new Singleton1();}}}return instance;}
}


1、适用于单线程环境(不推荐)

此方式在单线程的时候工作正常,但在多线程的情况下就有问题了。如果两个线程同时运行到判断instance是否为null的if语句,并且instance的确没有被创建时,那么两个线程都会创建一个实例,此时类型Singleton1就不再满足单例模式的要求了。
 

   public static Singleton1 getInstanceA() {if (null == instance) {instance = new Singleton1();}return instance;}
}


2、适用于多线程环境,但效率不高(不推荐)

为了保证在多线程环境下我们还是只能得到该类的一个实例,只需要在getInstanceB()方法加上同步关键字sychronized,就可以了。但每次调用getInstanceB()方法时都被synchronized关键字锁住了,会引起线程阻塞,影响程序的性能。

public static synchronized Singleton1 getInstanceB() {if (instance == null) {instance = new Singleton1();}return instance;}


3、双重检验锁

为了在多线程环境下,不影响程序的性能,不让线程每次调用getInstanceC()方法时都加锁,而只是在实例未被创建时再加锁,在加锁处理里面还需要判断一次实例是否已存在。
 

  public static Singleton1 getInstanceC() {// 先判断实例是否存在,若不存在再对类对象进行加锁处理if (instance == null) {synchronized (Singleton1.class) {if (instance == null) {instance = new Singleton1();}}}return instance;}


4、静态内部类方式(推荐)加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。 由于在调用 StaticSingleton.getInstance() 的时候,才会对单例进行初始化,而且通过反射,是不能从外部类获取内部类的属性的;由于静态内部类的特性,只有在其被第一次引用的时候才会被加载,所以可以保证其线程安全性。 
总结: 
优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。 
劣势:需要两个类去做到这一点,虽然不会创建静态内部类的对象,但是其 Class 对象还是会被创建,而且是属于永久带的对象。

public class StaticSingleton {/*** 私有构造方法,禁止在其他类中创建实例*/private StaticSingleton() {}/*** 获取实例*/public static StaticSingleton getInstance() {return StaticSingletonHolder.instance;}/*** 一个私有的静态内部类,用于初始化一个静态final实例*/private static class StaticSingletonHolder {private static final StaticSingleton instance = new StaticSingleton();}/*** 方法A*/public void methodA() {}/*** 方法B*/public void methodB() {}public static void main(String[] args) {StaticSingleton.getInstance().methodA();StaticSingleton.getInstance().methodB();}
}


 


http://www.ppmy.cn/news/259228.html

相关文章

好用的网站

本文记录本人发现的好用的学习、工具网站。 菜鸟教程:https://www.runoob.com/ 提供了编程的基础技术教程, 介绍了 HTML、CSS、Javascript、Python, Java, Ruby, C, PHP , MySQL 等各种编程语言的基础知识。 Matlab: https://ww2.mathworks.cn/help/matlab/index.h…

干多了、干少了、干好了

(1)产品 四流的产品看有多少个功能点、多少个输入界面、多少个输入字段、多少张输出报表。 三流的产品看支持多少条主辅业务流程、多少条异常业务处理流程。 二流的产品看数据模型。 一流的产品看业务模型。 (2)商品 一个完整的商…

hibernate 好用还是mybatis好用

转载:https://www.v2ex.com/t/518087 2 Mogugugugu 2018-12-16 21:53:04 08:00 via Android Java 混了这么多年不就是保守么。。。虽然也有创新,但是企业开发,用了什么新框架,小众框架,要重新踩坑不说,开…

家庭用洗地机到底好不好用、洗地机是不是智商税、试过才知道

洗地机是结合扫、拖、吸一体的多功能产品,它的面世很好的诠释了什么是新时代智能化的产物。它具备干湿垃圾一起清理的能力,之前我们做清洁的时候,需要扫地、擦地、清洗拖布等三步甚至四步才能完成,那现在使用洗地机之后仅需一个步…

非常好用的 npx!!!

非常好用的 npx npx是什么解决什么问题使用本地已安装的可执行工具,而不需要配置 scripts执行一次性命令使用不同的node版本运行命令 如何使用典型的使用场景Tip npx是什么 npm v5.2.0 引入的一条命令(npx),npx 会帮你执行依赖包…

非常好用的网站

爱资料工具:toolnb.com U钙网:uugai.com PickFrom:zh.pickfrom.net/ 中文加拼音注音:toneoz.com/ime/ 物种2000:www.sp2000.org.cn/ 微软爱写作:aimwriting.mtutor.engkoo.com/ 早年系统软件博物馆&#xf…

容量超大的晾衣机,还有烘干杀菌功能,云米智能晾衣机Sunny 2Pro体验

阴冷天气里,晾晒衣服是个大难题,好在这两年市面上有了晾衣机这种工具,既省地又方便,特别是那些支持暖风烘干的型号,尤其适合在冬天里使用,实际晾晒效果不亚于日晒,晚上收衣服的时候还可以打开照明灯,配合衣架升降功能,每天也能省下不少时间。 上周我就入手了一款云米智…

冲锋衣裤的正确洗涤方式

冲锋衣裤的正确洗涤方式 声明:本文系阿邦网独家稿件,未经许可,任何媒体和个人,不得全部或部分转载,违者必究。 冲锋衣冲锋裤这些压胶的衣服很多朋友都头疼应该如何洗涤,这里来详细介绍一下冲锋衣冲锋裤这类…