原创

单例模式

应用场景

封装一些常用的工具类,保证整个应用常用的数据统一
保存一些共享数据在内存中,其他类随时可以读取。
创建对象耗时或者耗费资源过多,但又需要频繁用到;
需要频繁的进行创建和销毁的对象;

注意:如果写成单例模式就不要用spring注入了,spring注入默认单例,两者重复

7种方式

饿汉式

线程安全

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

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

线程安全,类加载的时候实例化,意思就是在初始化instance的时候就new了,所以导致资源浪费(吹毛求疵的说)

懒汉式-线程不安全

线程不安全

public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
首次我调用getInstance,那么就会进行类加载,这时候instance引用没被初始化。
然后进行判断空后,给instance引用初始化一个对象。

下次调用getInstance因为是不是空,直接返回。

疑问:我调用getInstance后,都会返回一个对象。饿汉式只是说初始化的时候就new了对象,而我这做了判断再new,实质上都把对象new了。那么懒汉式节省资源体现在哪?
    
    体现在你调用类的其它方法的时候,它不会new(实例化)对象!

上代码!

懒汉式-同步方法

线程安全,同步方法

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 volatile Singleton instance;

    private Singleton() {
    }

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

兼顾效率和线程安全,可以用。但是性能不高

静态内部类(推荐)

线程安全

public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {

        private static final Singleton INSTANCE = new Singleton();
    }

}
业务这种够用,线程安全+懒加载

枚举

线程安全

public enum Singleton {
    INSTANCE;
}

知道就行,线程安全,防反射,防反序列化。其它方式不防!

枚举懒加载

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class ThreadPoolUtil {
    private enum innerEnum {

        INSTANCE;
        private final ThreadPoolExecutor executor;
        private final ThreadPoolUtil threadPoolUtil;

        innerEnum() {

            ThreadPoolExecutor.CallerRunsPolicy policy = new ThreadPoolExecutor.CallerRunsPolicy();

            executor = new ThreadPoolExecutor(0,
                    Integer.MAX_VALUE,
                    60L, TimeUnit.SECONDS,
                    new SynchronousQueue<Runnable>(),
                    policy
            );
            threadPoolUtil = new ThreadPoolUtil();
        }

        private ThreadPoolExecutor getThreadPool() {
            return executor;
        }

        private ThreadPoolUtil threadPoolUtil() {
            return threadPoolUtil;
        }
    }


    public static ThreadPoolUtil getInstance() {
        return innerEnum.INSTANCE.threadPoolUtil();
    }


    public ThreadPoolExecutor getThreadPool() {
        return innerEnum.INSTANCE.getThreadPool();
    }
}

这部分拿不准,先放在这里。所以说枚举到底是不是懒加载,是的话又例子论证吗?网上说法不一,搞不懂

最后再宣传一波,我的个人主页:个人主页,在这里你将收获我的成长知识库,不限于后端、前端、生活等知识库哟~

期待和老兵合作?想知道我能为你做什么?点击这里吧!我能做什么?


转载合作联系老兵,私自盗用必究!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 单例模式《单例模式概念、什么时候能用到单例模式、单例模式的好处》

    __new__方法是用来创建实例对象的,通过类去创建方法的时候,实际上类自动调用的__new__方法。

    清菡
  • 单例模式

    小小明童鞋
  • 单例模式

    单例模式,顾名思义,在程序运行时有且仅有一个实例存在。最常见的一个应用场景就是网站访问量的计数器,试想如果允许创建多个实例,那还怎么计数,这个时候就得创建有且仅...

    用户1148394
  • 单例模式

    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。 这样的模式有几个好处: 1、某些...

    xiangzhihong
  • 单例模式

    一、简介 1、单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2、C++设计一个单例模式的方法如下:         (1)构造函数声明为私有;...

    用户1215536
  • 单例模式

    概述 单例模式(Singleton Pattern),创建对象模式之一,单例模式确保一个类只能创建一个实例。单例模式适用于一个系统要求一个类只有一个实例时,比如...

    高爽
  • 单例模式

    如果想使得某个类从始至终最多只有一个实例,使用new方法会很简单。Python中类是通过new来创建实例的:

    用户2936342
  • 单例模式

    所谓饿汉式单例设计模式,就是将类的静态实例作为该类的一个成员变量,也就是说在JVM 加载它的时候就已经创建了该类的实例,因此它不会存在多线程的安全问题。

    栋先生
  • 单例模式

    唐怀瑟
  • 单例模式

      一种是饿汉式单例,饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;

    那一叶随风
  • 单例模式

    定义:   单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象...

    用户1134788
  • [设计模式]单例模式

    简介 单例模式(Singleton Pattern)保证一个类只有一个实例,并提供一个访问它的全局访问点。 单例模式是一种对象创建型模式 (可参考 设计模式 ...

    静默虚空
  • 单例模式

    背景:我们在实现单例模式的时候往往会忽略掉多线程的情况,就是写的代码在单线程的情况下是没问题的,但是一碰到多个线程的时候,由于代码没写好,就会引发很多问题,而且...

    大学里的混子
  • 单例模式

    这一章,我们对HashMap进行学习。 我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap。内容包括: 第1部分 H...

    大学里的混子
  • 单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    Dato
  • 单例模式

    此时的类还是无法使用的。因为构造函数已经被私有化了。我们需要一个静态方法和静态变量来间接的实例化对象。代码如下:

    魔王卷子
  • 单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,属于创建型模式。 单例模式定义:保证一个类仅有一个实例,并提供一个访问它...

    卡尔曼和玻尔兹曼谁曼
  • 单例模式

    /*************************************************************************

    程序员小王
  • 单例模式

    DeROy
  • 单例模式

    private static SingletonExample1 instance= null;

    路行的亚洲

扫码关注云+社区

领取腾讯云代金券