第一种:懒汉式(线程不安全)

代码实现:

class Singleton{private static Singleton singleton;private Singleton(){}//当调用getInstance()时才创建单例对象,饿汉式public static Singleton getInstance(){if(singleton == null){singleton = new Singleton();}return singleton;}
}

优缺点说明:

1) 起到了Lazy Loading的效果,但是只能在单线程下使用。

2) 如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及 往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以 在多线程环境下不可使用这种方式

3) 结论:在实际开发中,不要使用这种方式

第二种:懒汉式(线程安全,同步方法)

代码演示:

class Singleton{private static Singleton singleton;private Singleton(){}//加入了同步代码,解决线程不安全问题public static synchronized Singleton getInstance(){if(singleton == null){singleton = new Singleton();}return singleton;}
}

优缺点说明:

1) 解决了线程不安全问题

2) 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行 同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例, 直接return就行了。方法进行同步效率太低

3) 结论:在实际开发中,不推荐使用这种方式

第三种:懒汉式

(为了解决第二种效率太低的问题,但是还是会造成线程不安全)

代码实现:

class Singleton{private static Singleton singleton;private Singleton(){}public static  Singleton getInstance(){if(singleton == null){synchronized(Singleton.class){singleton = new Singleton();}return singleton;}
}

优缺点说明:

1) 这种方式,本意是想对第二种实现方式的改进,因为前面同步方法效率太低, 改为同步产生实例化的的代码块

2) 但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一 致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行, 另一个线程也通过了这个判断语句,这时便会产生多个实例

3) 结论:在实际开发中,不能使用这种方式

单例模式之懒汉式(三种代码实现)相关推荐

  1. 三种代码版本控制系统的简介 以及 SVN的安装

    三种代码版本控制系统的简介 以及 SVN的安装 一.三种代码版本控制系统 1.1 CVS 什么是cvs??? 1.2.Git 什么是Git??? 1.3.SVN 什么是SVN??? SVN的作用??? ...

  2. 【 史上最坑爹的Java代码系列02 】Java中的三种代码块

    Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题. 三种代码块:静态代码块.方法代码块.普通代码块 其中,普通代码块是比较少见而且比较少使用的. package com. ...

  3. 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成

    2019独角兽企业重金招聘Python工程师标准>>> 之前写了一些关于代码生成的文章,提供了两种不同方式的代码生成解决方案,即CodeDOM+Custom Tool和T4.对于AS ...

  4. java_security之base64原理解析以及三种代码的实现方式

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大 ...

  5. java的三种代码注释方式

    1.注释的作用 注释是对程序语言的说明,有助于开发者之间的交流,方便理解和维护程序.注释不是编程语句,不会被编译器执行.一些代码量少较少的程序,我们加不加注释对我们的理解和修改代码没有太大影响:如果是 ...

  6. 三种代码为wordpress添加上一篇/下一篇功能

    WordPress没有内置"上一篇 下一篇"功能,可是这个功能却是我们经常用到的,它不仅可以提高网站的用户体验度,而且能留住访客的脚步,增加网站的PV值. 现在wordpress模 ...

  7. Python的三种代码续行书写方法

    #第一种:三个单引号 print ''' 我是一个程序员         我刚开始学习python''' #第二种:三个双引号     print """ 我是一个程序员 ...

  8. JAVA-打印圆形三种代码

    三个代码 代码示例一 代码示例二 代码示例三 代码示例一 package three; import java.util.Scanner;//形象理解:在java.util下将Scanner拿过来用 ...

  9. android查看屏幕大小,android获取屏幕尺寸的三种代码

    第一种:DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); ...

  10. 用 Python画圣诞树的三种代码示例

    大家好,我是明哥. 马上就是圣诞节了,先提前祝大家圣诞快乐! 今天来给大家分享一波如何使用 Python 来画一颗圣诞节树,包含多种版本,从平民版到豪华版,像极了一个程度员从入门到高级秃头程序员的过程 ...

最新文章

  1. 软件项目随着数据量的不断增加,有什么优化方案么?
  2. obj + mtl 格式说明
  3. 【时序数据处理】pandas某些列由于n个数据导致的,通过Series生成Dataframe
  4. S2SH框架入门之使用struts2
  5. 算法-排序-计数排序(包含对非负数和整数的排序)
  6. 使用CDI简化JAX-RS缓存
  7. 如何在JS判断是否为IE浏览器
  8. 在Emacs24下的Java环境(Cedet+Elib+JDEE+ECB)
  9. P1725 琪露诺 题解(单调队列)
  10. spring2中jpa的配置和使用
  11. Linux服务器初步配置JDK+Tomcat+redis
  12. 图书管理系统软件测试报告_软件测试新手入门小知识点,一定要牢记
  13. js动态填充select
  14. 网页原型设计工具设计_网页设计工具从下往下
  15. 为什么看起来不是很复杂的网站,淘宝、腾讯却需要大量顶尖高手来开发?
  16. vb中产生随机数经典实例分析
  17. [论文笔记]Arbitrary-Oriented Scene Text Detection via Rotation Proposals
  18. doucument.referrer部分安卓机型一直为空问题
  19. F1赛车相关公开数据集
  20. 在ubuntu18.04 上使用键盘鼠标共享软件 Synergy

热门文章

  1. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第三章 中古时代的欧洲和阿拉伯
  2. android画板的实验报告,android实验报告模板_实验一
  3. 基于Qt5实现的截图工具分享(仿QQ截图功能)
  4. 无法完成操作,因为文件包含病毒或潜在的垃圾软件
  5. RISC-V MCU 自动浇花装置设计
  6. 线性代数————思维导图(上岸必备)(二次型)
  7. OSPF多区域配置实例
  8. 前端js获取屏幕高度
  9. 理解图像处理中的 双线性内插法(图文说明)
  10. NATAPP 内网穿透的使用