Java设计模式:单例模式
学而时习,稳固而之心,
好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下
单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例 ,
保证一个类仅有一个实例,并提供一个访问它的全局访问点
看到全局我想到了staic ,昨天晚上听课学习,老师问这个是什么模式,有同学说是单例模式,都没看到static 居然说单例,想想都可怕,我也是赶紧今天补充补充
下面看看单例的几种写法
第一种 饿汉模式
//饿汉模式
public class Singletion {//创建一个静态的类并实例化private static Singletion instance = new Singletion();// 私有构造方法private Singletion() {}//获取唯一可用的对象public static Singletion getInstance() {return instance;}public void Method(){System.out.println("单例模式学习");}}
调用
public class Main {public static void main(String[] args) {//获取唯一可用的对象Singletion singletion = Singletion.getInstance();//显示singletion.Method();}}
优点:饿汉模式天生是线程安全的,使用时没有延迟。
缺点:启动时即创建实例,启动慢,有可能造成资源浪费
第二种写法:
懒汉模式(通常也叫饱汉模式)
// 懒汉模式(饱汉模式)
public class Singletion {//创建一个静态的类private static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("单例模式学习");}}
方法调用
public class Main {public static void main(String[] args) {//获取唯一可用的对象Singletion singletion = Singletion.getInstance();//显示singletion.Method();}}
优点:懒加载启动快,资源占用小,使用时才实例化,无锁。
缺点:非线程安全。
第三种写法,懒汉添加锁
懒汉模式(饱汉模式) --线程安全
// 懒汉模式(饱汉模式) )--线程安全
public class Singletion {//创建一个静态的类private static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static synchronized Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("单例模式学习");}}
懒加载启动快,资源占用小,使用时才实例化,添加了锁
缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。
第四种写法:
懒汉模式(饱汉模式) )--双重加锁检查DCL(Double Check Lock)
// 懒汉模式(饱汉模式) )--双重加锁检查DCL(Double Check Lock)
public class Singletion {//创建一个静态的类private volatile static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static Singletion getInstance() {if (singleton==null){//同步块,线程安全的创建实例synchronized (Singletion.class){//再次检查实例是否存在,如果不存在才真的创建实例if (singleton ==null){singleton=new Singletion();}}}return singleton;}public void Method(){System.out.println("单例模式学习");}}
优点:懒加载,线程安全。
注:实例必须有 volatile 关键字修饰,其保证初始化完全。
第五种写法
Holder模式
// Holder模式
public class Singletion {/*** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/private static class SingletionHolder {/*** 静态初始化器,由JVM来保证线程安全*/private static Singletion instance = new Singletion();}/*** 私有化构造方法*/private Singletion() {}public static Singletion getInstance() {return SingletionHolder.instance;}public void Method() {System.out.println("单例模式学习");}}
优点:将懒加载和线程安全完美结合的一种方式(无锁)
参考连接
https://www.runoob.com/design-pattern/singleton-pattern.html
https://www.cnblogs.com/t0000/p/8250686.html
Java设计模式:单例模式相关推荐
- Java 设计模式 - 单例模式
Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...
- Java设计模式——单例模式
单例模式 1.什么是单例模式. 2.单例设计的几种实现方式. 2.1.懒汉式 2.2.饿汉式 2.3.登记式 3.总结 4.建议 1.什么是单例模式. 确保某一个类只有一个实例,并且提供一个全局访问点 ...
- Java设计模式——单例模式的七种写法
单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...
- JAVA设计模式--单例模式
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的 ...
- 我的Java设计模式-单例模式
就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...
- JAVA设计模式 - 单例模式
单例模式(Singleton)是软件设计中一种比较常见的 , 相对简单的设计模式 . 1 . 单例模式的定义 所谓单例 , 指的就是单示例 , 即某个类的实现对象有且仅能有一个 , 并提供对外调用的方 ...
- java设计模式—单例模式
(一)单例模式 java中一共有23种设计模式 : 是开发人员根据不同的代码场景总结出来的不同的实现方法, 归纳为23种代码的设计方法, 单例模式就是其中的一种. 单例模式 : 在整个系统中,一个类 ...
- 【文末抽书】Java设计模式--单例模式
来源 :投稿 | 作者 : gyl-coder|原文:阅读原文 在介绍单例模式之前,我们先了解一下,什么是设计模式? 设计模式(Design Pattern):是一套被反复使用,多数人知晓的,经过分类 ...
- java设计模式---单例模式
关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
最新文章
- android加固多渠道,Android 多渠道打包(使用友盟统计,结合360加固宝进行多渠道打包)...
- 如何设置多个图层层叠关系_凉山车载式叠螺污泥脱水机_山东领旗环保科技
- 数据库开发——MySQL——简单介绍和安装
- pom.xml配置文件配置jar(不用记,快速配置)
- 机器学习——决策树的实现
- 顺序表(线性表的顺序存储)---C语言版
- c# 字符串格式化为日期格式
- concurrenthashmap为什么是线程安全_为什么 StringBuilder 不是线程安全的?
- python深度学习介绍
- 阿里巴巴java开发手册心得_阿里巴巴JAVA开发手册总结
- LU分解法python程序代码
- rf2o_laser_odometry和robot_localization
- 如何处理计算机显卡故障,电脑显卡常见故障及解决方案
- ThinkPad T480 Win10系统键盘失灵
- 肾炎患者识别matlab,肾炎诊断 模型.doc
- mysql查询和更改时区
- MATLAB去读网页源码时中文乱码
- NJ 时钟自动调整功能(SNTP)
- Cerberus恶意软件团队解散,10万美元拍卖源代码工程
- 认知心理学有感(2)-感觉与知觉