标签: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