Java设计模式--单例模式

单例设计模式

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。

核心知识点如下:

(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

(3) 定义一个静态方法返回该类的实例。

方法一就是传说的中的饿汉模式 优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题; 缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

方法二就是传说的中的饱汉模式 优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存; 缺点是:并发环境下很可能出现多个SingletonTest实例。

方法三为方法二的简单优化

优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。 缺点是:同步方法频繁调用时,效率略低。

方法四为单例模式的最佳实现。内存占用地,效率高,线程安全,多线程操作原子性。

(事实上,可以通过Java反射机制来实例化private类型的构造方法,此时基本上会使所有的Java单例实现失效。本帖不讨论反射情况下问题,默认无反射,也是常见的面试已经应用场景)

代码拷来总觉浅,绝知此事要躬行

原文发布于微信公众号 - JAVA高级架构(gaojijiagou)

原文发表时间:2018-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏彭湖湾的编程世界

【PHP】当mysql遇上PHP

一.利用PHP连接mySQL数据库 这要从一个故事说起。 某一天,一位名叫MySQL的农夫的一把斧子(数据库操作)掉进了一条名为PHP的河里,这时候,一位好心...

2628
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础19(02)总结IO流,异常try…catch,throws,File类

案例: a:考试成绩必须满足在0——100之间,不满足就抛出异常。 package cn.itcast_08(1); import java.util.Sca...

3985
来自专栏python爬虫日记

转载:python的编码处理(一)

最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 

1042
来自专栏Linux驱动

22.QT-QXmlStreamReader解析,QXmlStreamWriter写入

XML 用于存储数据,数据的形式类似于树结构(参考: http://www.runoob.com/xml/)

1635
来自专栏小二的折腾日记

day5(面向对象2)

用来将文件或文件夹封装成对象。 方便对文件与文件夹的属性信息进行操作。 File对象可以作为参数传递给

661
来自专栏行者常至

java.lang.ClassCastException: java.lang.String cannot be cast to com.qbz.entity.TblUser

893
来自专栏desperate633

深入Redis的List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

1553
来自专栏爱撒谎的男孩

设计模式之单例模式

1474
来自专栏Python

python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题

1.5K2
来自专栏决胜机器学习

Shell基本操作与命令

Shell基本操作与命令 (原创内容,转载请注明来源,谢谢) 本文主要是我最近学习shell语言的学习笔记,主要在于通过学习这些内容,达到看得懂shell脚...

3565

扫码关注云+社区

领取腾讯云代金券