简单引入

单例设计模式作为最简单,最常用的设计模式。一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题。后面介绍标准写法,以规避这些问题。

1.懒汉式:


/*** 问题在于,当多线程工作的时候,如果有多个线程同时运行到if (instance ==* null),都判断为null,那么两个线程就各自会创建一个实例——这样一来,就不是单例了。*/
class Singleton {private Singleton() {};private static Singleton s;public static Singleton getInstance() {if (s == null) {s = new Singleton();}return s;}}

2.恶汉式

class Singleton {private Singleton() {}private static Singleton singleton = new Singleton();public static Singleton getInstance() {return singleton;}}

标准写法

改变懒汉式1.

(规避线程安全问题)加上 synchronized修饰方法即可

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

改变懒汉式2. 双重检查 Double-Check』写法

1.第一个if 只有instance为null的时候,才进入synchronized的代码段——大大减少了几率。
2.第二个if 是为了防止可能出现多个实例的情况。

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

改变懒汉式2.之终极版 防止指令重排列 volatile

不知道原子操作,与指令重排的建议复习下

 class DoubleCheck2 {private DoubleCheck2() {}private static volatile DoubleCheck2 sCheck;public static DoubleCheck2 getInstance() {if (sCheck == null) {synchronized (DoubleCheck2.class) {if (sCheck == null) {sCheck = new DoubleCheck2();}}}return sCheck;}}

1.恶汉式:

说白了,有classloder装载 就是一开始就创建类

/** 缺点也就只是饿汉式单例本身的缺点所在了——由于INSTANCE的初始化是在类加载时进行的,而类的加载是由ClassLoader来做的,* 所以开发者本来对于它初始化的时机就很难去准确把握:* * 可能由于初始化的太早,造成资源的浪费 如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好。*/
class Singleton {private Singleton() {}private static final Singleton singleton = new Singleton();public static Singleton getInstance() {return singleton;}}

由于静态内部类实现

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

转载于:https://www.cnblogs.com/dgwblog/p/9114189.html

单例设计模式singleton相关推荐

  1. Java设计模式—单例设计模式(Singleton Pattern)完全解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  2. 单例设计模式-静态内部类

    静态内部类 静态内部类应用实例 代码演示 package com.atguigu.principle.singleton.type07;/** * @author victor * @site htt ...

  3. Java面向对象(16)--单例(Singleton)设计模式

    所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法.如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构 ...

  4. 设计模式的征途—1.单例(Singleton)模式

    单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...

  5. 单例设计模式(Singleton)附带案例代码仓库

    目录 1 .单例模式的结构 2 .单例模式的实现 2.1.饿汉式(静态变量方式) 2.2.饿汉式(静态代码块方式) 2.3.懒汉式(线程不安全) 2.4.懒汉式(线程安全) 2.5.懒汉式(双重检查锁 ...

  6. 什么是Singleton,单例设计模式

    Singleton  [ˈsɪŋɡltən] 单例模式 在java中是指单例设计模式. 单例设计模式: 单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 例如:例如 ...

  7. 单例设计模式详解。。。。。。。。。。。

    public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub /* ...

  8. java单例设计模式

    单例模式的概念 单例类只有一个实例,并且只由自己创建,实例化后向整个系统提供自己的实例. 单例设计模式主要分为2种:懒汉式和饿汉式.2者的区别在于初始化的时间不同. 像线程池,缓存,日志等都被设计成单 ...

  9. 单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举

    懒汉式(线程安全,同步代码块)应用实例 优缺点说明: 1) 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低, 改为同步产生实例化的的代码块 2) 但是这种同步并不能起到线程同步的作 ...

最新文章

  1. 一生应该感谢的十种人
  2. JAVA 利用SimpleDateFormat将String转换为格式化的日期
  3. Linux内核中无名管道pipe和有名管道fifo的分析
  4. JS 新建web sql 数据表
  5. linux之进程间通信--使用信号
  6. 多线程场景下利用ThreadLocal是线程安全?
  7. 二维数组各行求和_JS数组reduce()方法详解及高级技巧
  8. 使用Visual Studio来创建动态库/静态库,并加载
  9. 小莫qq影视机器人-自定义对接影视教程
  10. knx智能照明控制系统电路图_智能照明控制系统(KNX)教材
  11. android 微信授权失败,安卓端微信授权失败,返回code=-1
  12. 空手套白狼的典型案例,利用各方资源一年狂赚300万!
  13. web前端期末大作业 html+css学生心理 7页主题网页设计
  14. 夏天第一图noob sky
  15. 探寻埋藏在心底的梦想,社科院与杜兰大学金融管理硕士项目伴你同行
  16. CRM 学习笔记(一)
  17. 零基础入门CV - Task 03 字符识别模型.md
  18. 整理了MariaDB和MySQL数据库历年发布版本和对应关系,方便记忆命令。
  19. 如何修改报表平台中数据决策系统登陆地址
  20. 小米手机开启“启用MIUI优化”,导致Android Studio无法成功直接安装

热门文章

  1. office365为新建账号发送欢迎邮件
  2. vs2013 类名颜色显示黑色,无法修改
  3. 微信小程序wx.navigateTo路由循环嵌套问题解决
  4. 【es6】es6学习笔记
  5. 【PTA 天梯赛】L2-1 分而治之(结构体存边)
  6. 拷贝构造函数的第一个参数必须是自身类类型的引用
  7. IntelliJ IDEA 2017.3.2 热加载(Hot Swap)
  8. NOIP2017游记
  9. HBase 系统架构
  10. DW数据仓库与ODS的区别