懒汉模式

懒汉模式即生成对象实例的时机是在第一次需要该实例时,与饿汉模式相对应

1.基本懒汉式

public class Test_2 implements Serializable {//懒汉在类加载时并不创建实例对象,而是置为nullprivate static Test_2 Instance=null;//私有方法防止外部调用创建对象private Test_2(){System.out.println("构造方法");}//外部类获得单例对象方法,懒汉是在获取Instance时生成实例对象public static Test_2 getInstance(){if (Instance==null)Instance=new Test_2();return Instance;}//其他方法public static void otherMethod(){System.out.println("other");}
}

此方法实现会有线程安全问题,如果当两个或多个线程同时在getInstance时,若刚刚好都对Instance==null判断成立,在同一时间段进入对象生成代码段,最后每个线程创建不同的实例对象,线程不安全。解决方法如下:在方法上加上锁,这样每个时刻都只能有一个线程来访问这个方法。但是该方法性能并不高,因为我们需要防止的只是在最开始Instance=null时导致的多个线程去创建实例对象。而当度过该时间段后,所有的线程都不会去创建实例对象,也就不需要该锁。从而导致性能低。

public static synchronized Test_2 getInstance(){if (Instance==null)Instance=new Test_2();return Instance;}

2.DCL双检锁实现懒汉式

由于普通方式性能低,从而有了DCL来对此进行优化,该方法是先判断Instance是否为null,如果为空才会去加锁让线程竞争,如果不为空直接执行完毕。从而提高效率。当加锁后进入的线程首先也会判断一次Instance是否为空,这是为了防止多个线程逃离第一次检查而进入锁的竞争阶段而导致的多个线程创建多个实例对象。

public class Test_2 implements Serializable {//懒汉在类加载时并不创建实例对象,而是置为nullprivate static volatile Test_2 Instance=null;//私有方法防止外部调用创建对象private Test_2(){System.out.println("构造方法");}//外部类获得单例对象方法,懒汉是在获取Instance时生成实例对象public static  Test_2 getInstance(){if (Instance==null)synchronized (Test_2.class){if (Instance==null){Instance=new Test_2();}}return Instance;}//其他方法public static void otherMethod(){System.out.println("other");}
}

而该方法在Instance前面要加上 volatile关键字,这是为了防止cpu指令流水为了高效率而对指令进行顺序调整而产生的错误。保证指令的按序发射。(当然也不完全一样,只是这个意思,并不是全部按照顺序,而是在某些地方不追求性能而保证安全,该处是对Instance的赋值顺序固定不变)

3.内部类实现懒汉

public class Test_3 {private Test_3(){}//静态内部类private static class Util{static Test_3 Instance=new Test_3();}//得到内部类创建的实例对象public static  Test_3 getInstance(){return Util.Instance;}//其他方法public static void otherMethod(){System.out.println("other");}
}

该方法是线程安全的因为内部类是static的,是jvm保证创建的线程安全,而且当调用其他方法时,并没有触发内部类的加载,从而是懒汉式

单例模式懒汉单例实现相关推荐

  1. 单例模式(懒汉单例和饿汉单例)

    转载于:http://www.manongjc.com/article/53899.html ==单例模式就是指一个类在整个程序中只有一个实例.==确保一些不需要重复创建的类创建多余的实例.特别是某些 ...

  2. 饿汉单例、懒汉单例类

    一.单例模式 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象. 例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间. 二.饿汉单例类 1.饿汉单例 ...

  3. 001_支持并发的两次判空懒汉单例

    package com.zr.single;/*** 支持并发的两次判空懒汉单例*/ public class TwiceJudgeNullLazySingleton {private TwiceJu ...

  4. 单例模式(单例设计模式)详解

    在有些系统中,为了节省内存资源.保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自 ...

  5. Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...

  6. EffectiveJava-强化懒汉单例(图示看懂为什么懒汉会线程不安全)

    何为单例 概念:某个类中只存在一个实例,且只提供一个全局访问点 场景:很多时候一些类不需要重复创建,比如配置.工具类等 与静态方法区分:静态方法也符合上述描述,某个类不需要重复创建.他和单例模式性能相 ...

  7. struts单例模式 java_Java单例设计模式详细介绍

    Java单例设计模式教程中包含了单例模式的定义.特点以及线路安全等问题. 单例模式定义: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象 ...

  8. C#WinForm 窗体单例模式 反射单例

    做了个mdi窗体 原以为指定一下MDIParent就可以了 没想到多次点击会出现多个窗体的现像 所以用到了单例模式 做法是这样的(学习出处:连接) 1.在子窗体声明一个子窗体类型的私有静态变量 并把子 ...

  9. 单例模式及单例类的两种实现

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

最新文章

  1. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类
  2. YUV视频格式到RGB32格式转换的速度优化 上篇(转)
  3. bzoj1601【Usaco2008 Oct】灌水
  4. 当session失效后,无论点击那个页面,都找到顶端页面,跳到登录页面。
  5. 打通前后端,这款效能提升开源“神器”你一定要了解
  6. JavaFX UI控件教程(二十二)之Titled Pane和Accordion
  7. mysql 按照两个字段之和进行排序
  8. 数据库-MySQL-JDBC框架
  9. xml+javascript实现简单图片轮换
  10. 人人网 校内- 日志分享
  11. Calendar 设置周一为每周第一天
  12. gabor滤波器matlab实现,使用matlab实现Gabor滤波器
  13. 泰克Tektronix示波器上位机软件NS-Scope介绍
  14. Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用
  15. 《App架构师实践指南》---笔记
  16. 知名互联网公司面试题
  17. 2017北大数学夏令营第一天第二题的解答
  18. 巴曙松:寻找可持续的经济复苏
  19. Java过滤字符串中的手机号+提取字符串中的手机号+验证是否存在手机号
  20. 根据经纬度计算速度和角度

热门文章

  1. 装修就选集成墙板装饰材料
  2. 一个三十岁中国男人的婚姻思考 转帖
  3. java计算机毕业设计VUE技术小区车辆档案车位管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
  4. 注册热键——RegisterHotKey
  5. 计算机桌面变小,电脑桌面变小了怎么办
  6. 2022年度全球250个最大专利持有者:松下、三星、日立、中科院、佳能列前五 | 美通社头条...
  7. linux7的mcelog在哪,mcelog用法详解 - osc_bgoqj0sj的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 更省APP省钱密令填什么,省钱密令是什么?
  9. PPT:一个PPT中怎么引入另一个PPT的源格式内容
  10. RTOS任务调度思想汇总