茴香豆的“茴”字有几种写法?

有一回对我说道,“你读过书么?”我略略点一点头。他说,“读过书,……我便考你一考。茴香豆的茴字,怎样写的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些字应该记着。将来做掌柜的时候,写账要用。”我暗想我和掌柜的等级还很远呢,而且我们掌柜也从不将茴香豆上账;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是草头底下一个来回的回字么?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“对呀对呀!……茴字有四样写法,你知道么?

面试中会问到单例模式,选择其中一种或几种写法作为话头,考查设计模式和coding style的同时,还很容易扩展到其他问题。这里讲解8种常用的写法,下次遇到面试官可以直接甩到他面前!但切忌生搬硬套,去记“茴香豆的写法”。

简介

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

实现思路

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。

8种写法

1.饿汉式一

  • 优点:这种写法比较简单,静态常量,就是在类装载的时候就完成实例化。避免了线程同步问题。
  • 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
    代码:
public class Singleton {//私有静态常量private final static Singleton INSTANCE = new Singleton();//私有构造private Singleton(){}//静态工厂方法public static Singleton getInstance(){return INSTANCE;}
}

2.饿汉式二
这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。
代码:

public class Singleton {private static Singleton instance;//静态代码块static {instance = new Singleton();}//私有构造private Singleton() {}public Singleton getInstance() {return instance;}
}

3.懒汉式一
这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。
代码:

public class Singleton {private static Singleton singleton;//私有构造private Singleton() {}public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

4.懒汉式二
解决上面第三种实现方式的线程不安全问题,做个线程同步就可以了,于是就对getInstance()方法进行了线程同步。缺点:效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。
代码:

public class Singleton {private static Singleton singleton;//私有构造private Singleton() {}public static synchronized Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

5.懒汉式三
由于第四种实现方式同步效率太低,所以摒弃同步方法,改为同步产生实例化的的代码块。但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。
代码:

public class Singleton {private static Singleton singleton;//私有构造private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}

6.双重检查
Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。优点:线程安全;延迟加载;效率较高。
代码:

public class Singleton {private static volatile Singleton singleton;//私有构造private Singleton() {}// 双重检查public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {//里面的判断是一定要加的,否则出现线程安全问题if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}

7.静态内部类
这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
优点:避免了线程不安全,延迟加载,效率高。
代码:

public class Singleton {//私有构造private Singleton() {}//静态内部类private static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}

8.枚举
借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。可能是因为枚举在JDK1.5中才添加,所以在实际项目开发中,很少见人这么写过。
代码:

public enum Singleton {INSTANCE;public void whateverMethod() {}
}

对比

茴香豆的“茴”有几种写法?单例模式你知道有几种写法?相关推荐

  1. matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?

    时隔十二天终于等到宋老师的回复后,我拿到了自己的憨憨照片. (后知后觉的宋老师) 刚好考完认知期中(然后三周过去了),便摸个鱼,研究一下Photoshop的使用.今天就整理一下有关模糊的方法. 模糊的 ...

  2. 关于“茴香豆的‘茴’有几种写法”:学习过程中,若时间精力有限则优先记住最好用的一种

    学习过程中的细节整理和精力节省权衡 我平时学习有整理总结.记笔记的习惯. 我学新东西总是很慢,因为细节处几乎都不会放过,会去发散,去深挖,去比较之前. 刚才上网,查了C语言中二维数组的赋值方式,某个结 ...

  3. HelloWorld! 程序猿同志,茴香豆的茴字有几种字法?

    挖煤的矿工,久处深矿,不见天日. 一新矿工某日第一次出井, 就要重见天日.正欲抬头睁眼之时, 守在井口的人对他大声吼到: "别睁大眼,慢点出来,千万别睁大眼, 小心太阳光,亮瞎你狗日的眼睛& ...

  4. java单例模式 三种_三种java单例模式概述

    在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...

  5. python单例模式继承_Python四种实现单例模式的方法

    在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...

  6. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  7. python书写风格_以下两种风格 Python 写法,请问大家倾向哪种:)

    看到不同的同事代码,表达同一个意思,主要 if 部分以下哪种写法比较好些:) 第一种写法 def xxxx(ph, sin_id): """ ""&q ...

  8. 单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率

    这段时间从头温习设计模式.记载下来,以便自己复习,也分享给大家. [java] view plaincopy package com.iter.devbox.singleton; /** * 饿汉式 ...

  9. java中的23种设计模式_Java开发中的23种设计模式详解

    所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. [J ...

  10. while(true) Thread.Sleep(XX)我通常是用这种写法,有没有更好的写法或者改进

    比如一个TCP通讯 里面有一个看门狗来监听连接是否正常 我通常是用这种写法,有没有更好的写法或者改进,欢迎讨论. 没什么问题,只要不是死循环或者耗费掉过多内存 看什么场合,写小程序这么写没毛病啊. 我 ...

最新文章

  1. 大写的服!中科大博士写20万字论文:如何给女朋友送礼物
  2. python实训项目-黑马程序员上海校区Python21期Django项目实训
  3. ZJU PAT 1027 Colors in Mars
  4. 模拟六:STEMA 考试选择题模拟练习试卷(中级组)及答案 + 自我解题笔记
  5. 【收藏】使用命令行创建maven web项目
  6. 聚焦智造 共筑生态——“2016智能硬件生态圈品牌交流会”即将举行
  7. 数组序列化 java_Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)...
  8. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...
  9. [zz]ASP.NET MVC2框架验证学习笔记
  10. UnityShader7:内置包含文件UnityCG.cginc与GG/HLSL语义
  11. [朴素妍][뭐라고 끝낼까][说什么结束]
  12. java反射跨空间调用类_10 Java 对象的内存布局
  13. 小米路由mpk插件二维码_小米WiFi6路由器新品:修改密码自动同步已连接设备,这功能不错...
  14. 【Python爬虫Scrapy框架】一、Scrapy爬虫框架的入门案例
  15. ESP32 LVGL8.1 ——Style Text 设置文字样式 (Style 8)
  16. python pip中的Fatal error in launcher错误及解决
  17. 刘天佐加盟《经济适用男》 变身木讷IT精英_0
  18. 如何用 Python 实现 QQ 消息自动回复?
  19. 递归算法中的时间复杂度分析
  20. Java读取文件转换成byte[]的小结

热门文章

  1. 罗格斯的计算机科学博士奖学金,本科直博如何“牛”转乾坤斩获全奖博士录取,师兄制胜申请经历大揭秘!...
  2. jacob 插入水印方法整理
  3. 编码规范 SonarQube检测出的bug、漏洞以及异味的修复整理
  4. 使用Python-OpenCV将图片批量转换为jpg格式
  5. 如果宇宙是答案,那么问题是什么?
  6. 银联统一规范的收单业务消息域
  7. 【运维心得】如何一步切换企业邮箱主域名
  8. matlab解二元二次方程组
  9. nowcoder16638 carpet
  10. 学生管理系统——数据库表设计