【经典结构】单例模式Singleton
单例模式Singleton
1.含义
单例模式:即一个类只能创建一个实例。
- 只有一个实例 --> 不可以从类外new对象 --> 构造器私有化private --> 从类里创建实例;
- 这个对象供外部使用 --> 该实例的get方法 --> 没有对象,随着类加载 --> 方法声明为static --> 静态只能调静态 --> 该实例也声明为static;
2.实现
2.1 饿汉式
public class Singleton(){
//1.私有化构造器;
private Singleton();
//2.创建实例;静态;
private static Singleton singleton = new Singleton();
//3.获取实例的公共方法;静态;
public static Singleton getSinggleton(){
return singleton;
}
}
特点
多线程安全:是;
lazy初始化:否;
类加载就创建实例,浪费内存;
2.2 懒汉式,线程不安全
public class Singgleton(){
private Singleton();
private static Singleton singleton; //延迟创建对象;
public static Singleton getSingleton(){
if(singleton == null){ //调用方法的时候没有了再创建;
singleton = new Singleton();
}
return singleton;
}
}
特点
多线程安全:否 (当有多个线程操作时,可能会有多个线程都经过if判断语句,就会创建多个实例,造成线程不安全);
lazy初始化:是;
2.3 懒汉式,线程安全
public class Singleton(){
private Singleton();
private static Singleton singleton;
//给方法加锁;
public static synchronized Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
特点
多线程安全:是
lazy初始化:是
效率:低(每次都只是一个线程拿到锁,调用方法,多个线程无法同时调用方法)
2.4 双重检验锁
public class Singleton(){
private Singleton();
//使用volatile声明:
//1.禁止指令重排;
//2.保证变量修改后对所有线程可见,指示JVM,这个变量是共享且不稳定的,每次用要到主存中去读取;
private volatile static Singleton singleton();
public static Singleton getSingleton(){
if(singleton == null){ //判断有没有实例化过,没有再进入加锁模式,这样绝大多数的都不会再进入了;
synchronized(Singleton.class){
if(singleton == null){ //再判断一次,因为可能有多个线程都经过了前面的if,if不判断就会创建多个对象了;
singleton == new Singleton();
}
}
}
return singleton;
}
}
多线程安全:是
lazy初始化:是
效率:高
- 第一个检验是为了效率;
- 第二个检验为了线程安全;
直接加锁再判断 --> 效率低;
先判断再加锁 --> 效率高;
【经典结构】单例模式Singleton的更多相关文章
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- 单例模式——Singleton
模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 笔记 单例模式 Singleton
//---------------------------15/04/09---------------------------- //Singleton 单例模式-----对象创建型模式 /* 1: ...
- 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性
模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- ooad单例模式-Singleton
单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...
- iOS单例模式(Singleton)写法简析
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
随机推荐
- Ascend Pytorch算子适配层开发
Ascend Pytorch算子适配层开发 适配方法 找到和PyTorch算子功能对应的NPU TBE算子,根据算子功能计算出输出Tensor的size,再根据TBE算子原型构造对应的input/ou ...
- MindSpore应用目标
MindSpore应用目标 以下将展示MindSpore近一年的高阶计划,会根据用户的反馈诉求,持续调整计划的优先级. 总体而言,会努力在以下几个方面不断改进. 1. 提供更多的预置模型支持. 2. ...
- Caffe框架GPU与MLU计算结果不一致请问如何调试?
Caffe框架GPU与MLU计算结果不一致请问如何调试? 某一检测模型移植到Cambricon Caffe上时,发现无法检测出结果,于是将GPU和MLU的运行结果输出并保存后进行对比,发现二者计算结果 ...
- NVIDIA GPU卷积网络的自动调谐
NVIDIA GPU卷积网络的自动调谐 针对特定设备和工作负载的自动调整对于获得最佳性能至关重要.这是关于如何为NVIDIA GPU调整整个卷积网络. NVIDIA GPU在TVM中的操作实现是以模板 ...
- BlazorCharts 原生图表库的建设历程
作者:陈超超 Ant Design Blazor 项目贡献者,拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,现就职于正泰集团. 邮箱:timchen@live.com 欢迎各位读 ...
- Docker-compose搭建ELK环境并同步MS SQL Server数据
前言 本文作为学习记录,供大家参考:一次使用阿里云(Aliyun)1核2G centos7.5 云主机搭建Docker下的ELK环境,并导入MS SQL Server的商品数据以供Kibana展示的配 ...
- 四、缓存DNS
作用:缓存解析结果,提高解析速度 搭建方式: 1.全局转发,所有的DNS解析请求全部转发给公网DNS 2.根域迭代,所有的DNS解析请求全部发给根域DNS服务器 真机上实现缓存DNS服务器 1.搭建Y ...
- 网页站点下载器teleport ultra
软件名称:teleport ultra 介绍:teleport ultra是一款专门的网页站点下载器,使用这款工具可以方便地下载网页数据,包括网站的文字.图片.flash动画等,可以轻松下载所有的网站 ...
- sentinel (史上最全+入门教程)
文章很长,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈 为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂 ...
- Redis 面霸篇:高频问题横扫核心知识点
「码哥字节」从高频面试问题跟大家一起横扫 Redis 核心知识点,从根本上理解 Redis ,不做八股文的工具人,做扭转乾坤的大神. 码哥到如今已经写了 9 篇 Redis 连载,后台有小伙伴也让我写 ...