单例--项目中用到单例的地方

Posted sunxuesong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例--项目中用到单例的地方相关的知识,希望对你有一定的参考价值。

【单例好处】

首先要先明白什么是单例?

单例就是保证在jvm堆内存中只能有一个实例。(不是在多个jvm当中)

单例模式有七种,一般情况下只会用到两种,懒汉式和饿汉式,下面我们来看看懒汉式和饿汉式的代码。

懒汉式:package com.springboot.design;

/**
 * @Author: sunxuesong@hztianque.com
 * @Description: 懒汉式设计模式,非线程安全
 * @Date: Created in 17:37 2019/7/19
 * @Modifired by:
 */
public class SingleTon 

    /**
     * 1、静态的
     * java虚拟机在加载的时候会先加载静态的代码
     * 不加static的话这个类是不能被初始化的
     */
    private static SingleTon singleTon;

    /**
     * 2、必须要有一个私有的构造函数
     * 目的就是为了防止被无限new,因为我们要保证在jvm堆内存中只能有一个实例
     */
    private SingleTon()

    

    /**
     * 懒汉模式,顾名思义:就是当你需要的时候再去创建
     * 这里在new之前要加入synchronized,因为当并发情况下不能保证jvm堆中只有一个实例
* 并发情况下会出现线程不安全 * synchronized作用域是当前类 * @return
*/ private static SingleTon getSingleTon() if (singleTon == null) synchronized (SingleTon.class) singleTon = new SingleTon(); return singleTon; public static void main(String[] args) SingleTon singleTon1 = SingleTon.getSingleTon(); SingleTon singleTon2 = SingleTon.getSingleTon(); // 打印结果是true System.out.println(singleTon1 == singleTon2);

饿汉式:

package com.springboot.design;

/**
 * @Title: SingleTon1
 * @Description: 饿汉式:当class文件被加载的时候就会被初始化,天生线程安全的
 * @author: sunxuesong@hztianque.com
 * @date: Created in 20:33 2019/8/3
 * @Modifired by:
 */
public class SingleTon1 

    /**
     * 1、静态的,final:只能初始化一次,不能被更改
     */
    private static final SingleTon1 singleTon = new SingleTon1();

    /**
     * 2、私有化构造函数
     */
    private SingleTon1() 

    

    private static SingleTon1 getSingleTon() 
        return singleTon;
    

    public static void main(String[] args) 
        SingleTon1 singleTon = SingleTon1.getSingleTon();
        SingleTon1 singleTon1 = SingleTon1.getSingleTon();
        // 打印结果是 true
        System.out.println(singleTon == singleTon1);
    

总结一下

单例好处:实例只会被初始化一次,不管你new多次,除了第一次的之外,后面都是用的同一个堆内存地址,节约内存

懒汉式和饿汉式区别:

懒汉式最大的特点就是对象被需要的时候去初始化,之后都是同一个实例,这样的好处是可以节约jvm中堆内存的资源,但是线程不安全,加了synchronzied后效率低

饿汉式最大的特点就是类在被加载的时候就初始化了,天生线程安全,而且效率高,因为不需要再初始化一次,但是它相比懒汉式要占用内存

以上是关于单例--项目中用到单例的地方的主要内容,如果未能解决你的问题,请参考以下文章

单例模式(补充)

单例模式(Singleton Pattern)

Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量

Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量

单例模式的坑

单例模式