单例--项目中用到单例的地方
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后效率低
饿汉式最大的特点就是类在被加载的时候就初始化了,天生线程安全,而且效率高,因为不需要再初始化一次,但是它相比懒汉式要占用内存
以上是关于单例--项目中用到单例的地方的主要内容,如果未能解决你的问题,请参考以下文章
Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量
Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量