单例模式的要点

单例模式属于创建型模式

三个要点:

  • 某个类只能有一个实例
  • 它必须自己创建这个实例
  • 它必须自行向整个系统提供这个实例

单例模式的特点

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一的实例
  • 单例类必须给所有其他对象提供这一实例

饿汉式单例类

线程安全,实现简单

优点:没有加锁,执行效率高

缺点:类在加载的时候就初始化,浪费内存

public class Singleton {

    private final static Singleton SINGLETON = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
return SINGLETON;
}
}

另一种实现:

public class Singleton {

    private static Singleton instance;

    static {
instance = new Singleton();
} private Singleton() { } public static Singleton getInstance() {
return instance;
}
}

懒汉式单例类

一:懒汉式,线程不安全

实现简单

没有加锁,在多线程情况下不安全

public class Singleton {

    private static Singleton instance;

    private Singleton() {
} public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

二:懒汉式,线程安全

实现简单,线程安全

优点:第一次调用的时候才初始化,避免了消耗内存

缺点:加了synchronized关键字,效率低

public class Singleton {

    private static Singleton instance;

    private Singleton() {
} public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

三:懒汉式,线程不安全

实现简单,线程不安全

做不到单例

public class Singleton {

    private static Singleton instance;

    private Singleton() {
} public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}

四:懒汉式,双检锁/双重校验锁

JDK1.5起

线程安全,实现较复杂

优点:线程安全,延迟加载,效率较高

注意:volatile关键字修饰很关键

public class Singleton {

    private static volatile Singleton instance;

    private Singleton () {
} public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

五:懒汉式,静态内部类

优点:线程安全,延迟加载,效率较高

原理:类的静态属性只会在第一次加载类的时候初始化。在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

public class Singleton {

    private Singleton() {
} private static class LazySingletonInstance {
private static final Singleton instance = new Singleton();
} public static Singleton getInstance() {
return LazySingletonInstance.instance;
}
}

六:懒汉式,枚举

JDK1.5起

线程安全,实现简单

优点:更简洁,自动支持序列化机制,绝对防止多次实例化

public enum  Singleton {
INSTANCE;
public void whateverMethod() { }
}

总结

一般而言,不建议使用第1、2、3种,建议使用饿汉方式。只有在要明确实现 lazy loading效果时,才会使用第 5 种静态内部类方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式

这个世界上只有一个你之Java设计模式:单例模式的更多相关文章

  1. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  2. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

  3. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  4. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  5. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  6. Java 设计模式 —— 单例模式

    1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...

  7. JAVA设计模式——单例模式

    单例模式的定义: Ensure a class has only one instance, and provide a global point of access to it.( 确保某一个类只有 ...

  8. Java设计模式-单例模式(Singleton)

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...

  9. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

随机推荐

  1. java中synchronized与Lock的异同

    本文转载自java中synchronized与Lock的异同 前言 synchronized和Lock通过互斥保障原子性,能够保护共享数据以实现线程安全,其作用包括保障原子性.可见性.有序性 常见问题 ...

  2. js实现element中可清空的输入框(2)

    接着上一篇的:js实现element中可清空的输入框(1)继续优化,感兴趣的可以去看看哟,直通车链接:https://www.cnblogs.com/qcq0703/p/14450001.html 实 ...

  3. Vue3.0+Electron聊天室|electron跨平台仿QQ客户端|vue3.x聊天应用

    基于vue3+electron11跨端仿制QQ桌面应用实战Vue3ElectronQchat. 使用vue3+electron+vuex4+ant-design-vue+v3scroll+v3laye ...

  4. 第39天学习打卡(UDP多线程在线咨询 URL)

    UDP多线程在线咨询  package com.kuang.chat; ​ import java.io.BufferedReader; import java.io.InputStreamReade ...

  5. tcpdump后台抓包并输出给wireshark

    # 先进到/tmp 目录执行,方便Filezila 传输 # 开启抓包 nohup tcpdump -i eth0 -s0 -nnA 'port 22' -w dump22.pcap & [1 ...

  6. 【产品设计】linux产品设计总结笔记

    Linux 预研产品设计   产品的目的: 1.综合集团内部重复性开发的工作,将多种操作系统统一到科东统一负责 2.明确技术在哪些设备上是可行的,再去拓展.一开始不做平台化产品 3.软件规划需要结合硬 ...

  7. Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板

    题目: In some social network, there are nn users communicating with each other in mm groups of friends ...

  8. SpringBoot项目创建与单元测试

    前言   Spring Boot 设计之初就是为了用最少的配置,以最快的速度来启动和运行 Spring 项目.Spring Boot使用特定的配置来构建生产就绪型的项目. Hello World 可以 ...

  9. C#类中的成员

    @ 目录 字段 属性 方法 构造函数 类和对象的简单解释 创建类和对象 类中成员的归属问题 字段 字段的声明与声明变量类似,可以添加访问修饰符,通常情况下字段设置为私有的,然后定义属性对字段的读写进行 ...

  10. 微服务架构Day16-SpringBoot之监控管理

    监控管理使用步骤 通过引入spring-boot-starter-actuator,可以使用SpringBoot提供应用监控和管理的功能.可以通过HTTP,JMX,SSH协议来进行操作,自动得到审计, ...