6种单例写法,你会写几种?

栏目: Java · 发布时间: 7年前

内容简介:优点:代码简单易读,由JVM类加载机制保证了线程安全,无需业务方关心。缺点:无法做到延迟创建对象,在加载class的时候就会创建对象。

第一种:饿 汉方式

6种单例写法,你会写几种?

优点:代码简单易读,由JVM类加载机制保证了线程安全,无需业务方关心。

缺点:无法做到延迟创建对象,在加载class的时候就会创建对象。

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

6种单例写法,你会写几种?

优点:代码简单易读。

缺点:在多线程情况下非现场安全,可能出现创建多个实例。

第三种:懒汉方式(线程安全)

6种单例写法,你会写几种?

优点:代码简单易读,线程安全。

缺点:每次调用时,都需要线程同步,性能较差。

第四种:内部类方式

6种单例写法,你会写几种?

优点:由JVM保证线程安全,不需要业务方关心。

缺点:第一次访问可能较慢,他需要加载内部类这样可能占用更多的code区域的内存。

第五种:枚举

6种单例写法,你会写几种?

枚举在单例上的使用较其他有点不太一样,使用示例如下:

Singleton.INSTANCE.doSomeThing();

优点:由JVM保证了线程安全,代码简洁。

缺点:代码不易理解。

Joshua Bloch大神较为推崇这种写法,他在《Effective Java》中明确表达过下面观点:

使用枚举实现单例的方法虽然还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法。

第六种:双重校验锁

6种单例写法,你会写几种?

优点:线程安全

缺点:每次访问对象都需要判null,并且volatile导致每次都会访问主内存,性能相比较而言较差。 该单例模式较容易出错,特别是volatile关键字要加,具体原因可以参考: Java面试官最喜欢问的关键字-volatile

总结

线程安全

性能

可读性

延迟加载

推荐使用不

恶汉

推荐

懒汉(非线程安全)

不推荐

懒汉(线程安全)

不推荐

内部类

一般

一般

枚举

一般

推荐

双重校验锁

一般

一般

一般

具体选择哪种方式肯定是具体场景具体分析;但是一般情况下,我是比较推荐恶汉和枚举方式。

大家如果阅读过JDK源码可能就会注意到,JDK主要采用的恶汉和懒汉模式,基本上不会采用枚举、双重校验锁;我猜测可能的原因双重双重校验锁再JDK1.5版本之前有问题并且枚举是在JDK1.5版本才引用的,导致历史上很多JDK在实现单例模式没有那么多选择。

其他很多开源项目在选择单例上就较为丰富,基本上每种单例都可能遇到,比如在Hystrix就遇到了恶汉模式(HystrixTimer)和内部类(HystrixPlugins)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网页设计

网页设计

顾群业 / 山东美术 / 2007-1 / 42.00元

网页设计,是指网页设计者以既有的技术和艺术知识为基础,依照设计目的和要求,自觉地对网页的构成元素进行艺术构思,创造出艺术化、人性化的网站界面。如今,网页设计也发展成为一种新的艺术形式,是设计艺术的重要组成部分。优秀的网页设计,不仅要有鲜明的主题、统一的风格,还要求内容与形式的高度统一。一起来看看 《网页设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具