单例模式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的更多相关文章

  1. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  2. 单例模式——Singleton

    模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...

  3. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  4. 设计模式 笔记 单例模式 Singleton

    //---------------------------15/04/09---------------------------- //Singleton 单例模式-----对象创建型模式 /* 1: ...

  5. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  6. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  7. ooad单例模式-Singleton

                                                单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...

  8. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  9. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

随机推荐

  1. CPU性能PK

    CPU性能PK AMD vs Intel 2020: Who Makes the Best CPUs? 英文原文链接:https://www.tomshardware.com/features/amd ...

  2. 行人检测与重识别!SOTA算法

    行人检测与重识别!SOTA算法 A Simple Baseline for Multi-Object Tracking, Yifu Zhang, Chunyu Wang, Xinggang Wang, ...

  3. Java面试题:==运算符与equals方法的区别

    据说这个面试题目,80%的程序员都会理直气壮的回答错误!! 一: ==运算符 如果比较的是基本数据类型,则直接比较数值是否相等,返回值为"true or false" 如果比较的是 ...

  4. 单点突破:Set

    HashSet HashSet存放的是散列值,它是按照元素的散列值来存取元素的. 元素的散列值通过hashCode方法计算 HashSet通过判断两个元素的Hash值是否相等,如果相等就会用equal ...

  5. 【C++】类

    一个简单例子: 1 //c++ 类 2 #include<iostream> 3 using namespace std; 4 class Point 5 { 6 private: 7 i ...

  6. VBS脚本编程(3)——常用函数

    数据类型转换函数 1.Hex 函数 返回表示十六进制数字值的字符串. Hex(number) number 参数是任意有效的表达式. 说明 如果 number 参数不是整数,则在进行运算前将其四舍五入 ...

  7. 开源版本的 uTools。可支持 uTools 所有插件生态

    话不多说,先放上截图和仓库地址: 代码仓库:github 故事背景 网络抓包 之前公司内部因为开发需要,需要和后端进行接口联调,测试环境的时候,经常会涉及到一些状态改变要看交互样式的问题.比如测试需要 ...

  8. Golang通过结构体解析和封装XML

    Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...

  9. Kubernetes的资源管理

    本节讲解为一个pod配置资源的预期使用量和最大使用量.通过设置这两组参数,可以确保pod公平地使用Kubernetes集群资源,同时也影响着整个集群pod的调度方式. 1.为pod中的容器申请资源 创 ...

  10. Nexus安装配置和使用

    Nexus安装配置和使用 第一步安装jdk yum install java-1.8.0-openjdk-devel 第二步下载nexus-3.12.1-01-unix.tar.gzjdk 下载地址: ...