单例模式的要点

单例模式属于创建型模式

三个要点:

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

单例模式的特点

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

饿汉式单例类

线程安全,实现简单

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

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

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. 处理ios键盘弹出按钮点击click失效

    用ontouchstart绑定事件即可,然后用 document.activeElement.blur();让键盘收起 this.value = value.replace(/\s/g, " ...

  2. 必知必会之Java注解

    必知必会之Java注解 目录 不定期更新中-- 元注解 @Documented @Indexed @Retention @Target 常用注解 @Deprecated @FunctionalInte ...

  3. if __name__ == '__main__':简单粗暴解释

    这个脚本被执行的时候,__name__ 值就是 __main__ ,才会执行 main()函数如果这个脚本是被 import 的话,__name__的值不一样.main()函数就不会被调用.这个句子用 ...

  4. 清除浏览器默认样式的reset.css(转载于reset.css的官方)

    /* http://meyerweb.com/eric/tools/css/reset/ v2.0-modified | 20110126 License: none (public domain) ...

  5. MySQL:单表查询

    在线数据库:http://sqlfiddle.com/ 建表脚本:https://gitee.com/bqzzz/sql/tree/master/Scripts 基本查询 ①.查询所有记录 SELEC ...

  6. Nginx配置翻译

    Windows 格式 server { listen 82; server_name localhost; root "D:/testfile/"; location / { in ...

  7. CCF(公共钥匙盒):思维+模拟

    公共钥匙盒 201709-2 这题的思路一开始不是很清晰,一开始想用贪心去做.但是发现按照题目的思路不对.所以这里采用的是类似于多项式的加减的处理. #include<iostream> ...

  8. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...

  9. docker+compose+nginx+php

    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 我用docker做什么? 快速搭建开发所需环境,测试实验新 ...

  10. Django分页器组建

    class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): & ...