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 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

py编程技巧-1.1-如何在列表、字典、集合中根据条件筛选数据

所有代码先加这行解决中文乱码问题 # -*- coding: utf-8 -*- 版本区别注意: py2.7: xrange(); py3.x: ra...

3427
来自专栏向治洪

java虚拟机构造原理

 Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三...

1826
来自专栏领域驱动设计DDD实战进阶

13-TypeScript单例模式

在JavaScript中,要实现设计模式比较复杂。而在TypeScript中因为使用面向对象的思想编程,要实现设计模式的方式与后端语言C#、Java等非常类似。...

2685
来自专栏IT技术精选文摘

阿里架构师带你深入浅出jvm

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

Java企业面试——Java基础

1. Java基础部分 1.1 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思? 重载Overload表示同一个类中...

2654
来自专栏逆向技术

C++反汇编第二讲,不同作用域下的构造和析构的识别

               C++反汇编第二讲,不同作用域下的构造和析构的识别 目录大纲:   1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间...

17510
来自专栏Golang语言社区

转--Golang语言语法汇总

最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考 数据类型 ---- var varName type,var var1,var2… type,...

34716
来自专栏LinkedBear的个人空间

唠唠SE的集合-00——概述 原

                        由于是数组实现,在增和删的时候会牵扯到数组增容、以及拷贝元素,所以慢。

732
来自专栏真皮专栏

python基本常识

tuple,str都可以看做是一种list,都可以进行切片操作。 利用切片操作,去掉一个字符串的前后空格。要注意是是前后空格是不止一个的,可能有很多个。

875
来自专栏每日一篇技术文章

Swift3.0 - 数据类型

// 插入操作 shoppingList.insert("Maple Syrup", at: 0)

601

扫码关注云+社区