码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-03 21:33:33      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:desc   ack   vat   style   有一个   项目   实例   out   b2b   

【单例好处】

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

单例就是保证在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后效率低

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

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

标签:desc   ack   vat   style   有一个   项目   实例   out   b2b   

原文地址:https://www.cnblogs.com/sunxuesong/p/11296273.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!