[设计模式] ------ 单例模式
单例模式,是众多设计模式中,写法最多,套路最多,坑最多,面试被问最多的设计模式。
基本上,单例模式在面试中已经被问烂了,依稀记得我的上家公司面试我的时候,说到设计模式,直接就说,写一种设计模式,但单例除外。
但不得不说,单例由于其概念简单,实用性广的特点,在项目中很是常见。
概念:
单例模式就是确保一个类只有一个实例的设计模式。
设计的思路无非就是先new一个实例,以后都用这个实例就行了。
难点在于什么时机new出这个实例,以及如何确保有且只有这一个实例。
五种常见的单例实现
第一种:饿汉式(新手写法)
提前加载,所以也无法延迟加载,效率不高,不推荐
public class HungurySingleton { //缺点,无法延时加载,没有使用就已经加载了private static final HungurySingleton mInstance = new HungurySingleton();private HungurySingleton(){}public static HungurySingleton getHunguryInstance(){return mInstance;}
}
第二种:懒汉式(入门写法)
没有提前加载,但多线程下并发可能会出现多个实例
public class LazySingleton {private static LazySingleton mInstance;private LazySingleton(){}public static LazySingleton getmInstance(){if(mInstance == null){//就是这里,如果两个线程并发访问,里面的new语句就会执行两次mInstance = new LazySingleton();}return mInstance;}
}
第三种:双重检查锁(能写出这个,就有点东西了)
很明显,这样写,就不怕上面的那种并发问题了
public class DLCSingleton {private static volatile DLCSingleton mInstance =null; //volatile关键字是为了禁止编译器对 volatile关键字修饰的变量进行重排序,并保证volatile变量的读操作发生在写操作之后private DLCSingleton(){}public static DLCSingleton getmInstance(){if(mInstance == null){ //第一次检查synchronized (DLCSingleton.class){ //同步代码块if(mInstance == null){ //第二次检查mInstance = new DLCSingleton();}}}return mInstance;}
}
第四种:静态内部类实现(高手写法)
利用静态内部类是在被调用时才会被加载,算是延迟加载
static final 修饰instance,初始化后就不会被修改,保证线程安全
public class StaticInnerSingleton { //完成了懒汉式的延迟加载,同时static保证了线程安全。private StaticInnerSingleton(){}public static StaticInnerSingleton getIntance(){return SingletonHolder.mIntance;}private static class SingletonHolder{ //私有的,初始化的时候,没有调用getIntance方法则不会加载//static,final是jvm提供的同步机制,初始化后就无法修改了private static final StaticInnerSingleton mIntance = new StaticInnerSingleton(); }
}
第五种:(牛人写法)
枚举做单例,think in java中的神思想,虽然我从来没见过谁在项目中实战用到
但看这个网上说的热火朝天,也是各种好处,比如写法简单,线程安全
public enum EnumSingleton {SPRING,SUMMER,AUTUMN,WINTER;
}
总结:
我只是列出常用的,当然,还有其他版本
比如静态代码块的写法,
还有双重检查锁前一个版本,就是没有第一步判空的写法,
还有用synchronized修饰方法的写法等等。
是我的话,一般情况下,
确保项目肯定没有并发的话,懒汉写法就没问题了。
一考虑到并发,就用双重检查锁的写法,是常用而且稳定的。
至于枚举写法,总之我还没有习惯这么写,可以尝试用用。
以上是个人意见,欢迎评论指正。
[设计模式] ------ 单例模式相关推荐
- Python设计模式-单例模式
Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...
- Android设计模式——单例模式(Singleton)
二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...
- 【学习笔记】ABAP OOD设计模式 - 单例模式
ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...
- Go 语言实现 23 种设计模式 单例模式
Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...
- java singleton inner class_Java面向对象设计模式-单例模式
Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...
- Java开发中常用的设计模式-单例模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...
- 炒冷饭系列:设计模式 单例模式
2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...
- 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
- 小视频源码,设计模式单例模式
小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...
最新文章
- Linux 命令集锦
- Android Fragment 你应该知道的一切
- python爬虫实例100-Python 练习实例1
- show profile 分析SQL
- UVa1600 PatrolRobot 巡逻机器人(bfs)
- 部署虚拟环境安装Linux系统(Linux就该这么学)笔记
- 数据分析学习笔记——Pandas库思维导图
- Python数据分析Numpy库方法简介(一)
- 智能优化算法:晶体结构算法-附代码
- 交换机基础知识点思维导图
- 微软官方地址下载sql 2000简体中文企业版(含SP3 SP4 下载地址)
- 搜狗输入法纯净_五款良心无广告的纯净输入法推荐
- android微信支付+指纹支付密码错误,为什么微信付款无法指纹支付密码?如何开启指纹支付?...
- Shader内置函数(方便自己看)
- mysql中查看密码有效期_Mysql5.7.9密码已过有效期的处理过程
- 请先切换至Wxml Pannel的解决方法
- Cacti的基本使用
- Mantis 安装与配置
- [埋坑系列] 基于QT/C++的杰瑞走迷宫小游戏 :1.大体构造
- linux 图像处理软件,最佳开源应用程序:图形/图像处理软件