1 懒汉式 写法一

这种写法是最普通的写法,在单线程中,构造被私有,只有sMSingletonDemo1为null的时候才会创建一个实例,但是在多线程中,当两个线程同时运行到sMSingletonDemo1==null的判断时,而sMSingletonDemo1确实没创建出来,这时候就有可能创建出两个实例,因此是为线程不安全。

public class SingletonDemo1 {private static SingletonDemo1 sMSingletonDemo1=null;private SingletonDemo1(){}public static SingletonDemo1 getInstance(){if (sMSingletonDemo1==null){sMSingletonDemo1=new SingletonDemo1();}return sMSingletonDemo1;}
}

2 懒汉式 写法二

针对写法一的多线程使用时可能创建出多个实例来,是线程不完全的范畴,可以采用解决线程安全的方法来解决
关键字synchronized的作用是实现线程间的同步。它的工作是对同步的代码加锁,使得每一次,只能有一个线程进入同步块,从而保证线程间的安全性。
当有两个以上的线程同时运行到sMSingletonDemo1==null的判断时,第一个线程加上锁后,第二个线程只能等待,当第一个线程释放锁后,第二个线种才能加上锁,这时sMSingletonDemo1已创建,自然不会再次创建实例了
这种写法相对来说,每次调用的时候都经历了加锁与释放锁的过程,因此比较耗时。

public class SingletonDemo2 {private static SingletonDemo2 sMSingletonDemo2=null;private SingletonDemo2(){}public static synchronized SingletonDemo2 getInstance(){if (sMSingletonDemo2==null) {sMSingletonDemo2=new SingletonDemo2();}return sMSingletonDemo2;}
}

3 懒汉式 写法三

针对写法二的优化

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

写法二 每次调用的时候都经历了加锁与释放锁的过程,因此比较耗时,在这时我们把同步锁块加入到内部,只有当sMSingletonDemo2实例为null时才会走加锁创建实例的过程。

4 饿汉式

当类加载的时候,就会创建类的实例,有点浪费内存空间,没有懒汉式的延迟加载特点。

public class SingletonDemo4 {private static SingletonDemo4 sMSingletonDemo2=new SingletonDemo4();private SingletonDemo4(){}public static SingletonDemo4 getInstance(){return sMSingletonDemo2;}
}

5 静态内部类的综合使用

结合了饿汉式与懒汉式的优点

public class SingletonDemo5 {private SingletonDemo5(){}private static class SingletonHolder{private final static SingletonDemo5 mSingletonDemo5=new SingletonDemo5();}public static SingletonDemo5 getInstance(){return SingletonHolder.mSingletonDemo5;}
}

对java android 中几种单例模式写法的总结相关推荐

  1. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  2. java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...

    [简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...

  3. Java/Android中的引用类型及WeakReference应用实践

    一.背景 一般意义上而言,Java/Android中的引用类型包括强引用.软引用.弱引用.虚引用.不同的引用类型具有各自适用的应用场景,并与JVM的GC直接相关. 作为Java/Android中的引用 ...

  4. java aes密钥生成_如何在Java(Android)中生成与.Net中相同的AES密钥?

    我需要从.Net WebService提供的salt和密码生成 Java( Android)中的AES密钥.我需要使用与.net生成的密钥相同的密钥和相同的密码和盐(使用Rfc2898DeriveBy ...

  5. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...

  6. android中几种定位方式详解

    目录 前言: 1.GPS定位 2.NETWORK定位 3.AGPS定位 4.基站定位 5.WIFI定位 6.混合定位 目前,移动端大致通过三种方式来进行设备定位:GPS.基站.wifi.本文就详细的讲 ...

  7. Android中五种常用对话框的使用

    场景 Android中常用的五种对话框为 常规对话框.带列表的对话框.自定义的对话框.带进度条的对话框.带日期选择器的对话框. 注: 博客: https://blog.csdn.net/badao_l ...

  8. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  9. android 定时器使用的比较,Android中几种定时器的总结和比较

    在android中,一般有下面几种方式实现定时任务: 采用Handler与线程的sleep(long)方法 采用Handler的postDelayed(Runnable, long)方法 采用Hand ...

最新文章

  1. 为什么有的人知道很多却一事无成?
  2. C语言实现一种简单的应用服务器内部数据结构的思路(三)
  3. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...
  4. Daily Scrum Meeting ——ZeroDay(Beta)12.08
  5. Redis中的淘汰策略
  6. 数据结构-判断一棵树是否为二叉排序树
  7. 2017/3/10 morning
  8. Qt界面制作(QSS、获取屏幕分辨率、自定义控件、版权)
  9. jQuery Mobile组件
  10. 生物信息学资料1,常用软件,酶切位点分析
  11. 微软Win11 商店各个应用可单独下载
  12. Telco Customer Churn(电信客户流失相关数据集)
  13. 怎么设置计算机开机顺序,教你设置电脑开机程序启动顺序的详细教程
  14. 单片机电流检测电路图大全(四款模拟电路设计原理图详解) - 信号处理电子电路图
  15. Deep Domain Confusion:Maximinzing for Domain Invariance阅读笔记
  16. 程序员简历项目经历怎么写 ?三条原则不可忽视 【项目案例分享】
  17. loglog()函数
  18. 学历、长相、家境普通的人,未来的发展方向是什么?00后的职业规划都已经整得明明白白
  19. 12306极速全自动抢票
  20. 枚举的定义和使用,位域相关知识

热门文章

  1. 研究CV、研究美,MMFashion开源库升级~
  2. AAAI 2020 | 腾讯优图10篇论文入选,含速算识别、视频识别等主题
  3. 五个很厉害的 CNN 架构
  4. oracle 常用隐藏参数_oracle 查看隐藏参数
  5. c语言程序设计电子图书 汉诺塔,用C写的汉诺塔(hanoi)程序
  6. 吴恩达老师经验:80%的数据+20%的模型=更好的机器学习
  7. CVPR 2020 | 中科院、商汤联合提出大规模多标签目标检测新算法
  8. mysql查询到最新记录就停止_使用Limit参数优化MySQL查询 在找到一个记录后将停止查询...
  9. mysql 查询两张表结构相同的数据库_数据库原理习题(含答案)
  10. qn模块java脚本_Qn271 对于网络编程 反射 IO 线程的一些一本入门程序 多多联系会加快 速度 WinSock-NDIS 269万源代码下载- www.pudn.com...