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

【单例好处】

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

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

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

懒汉式:package com.springboot.design;

/**
 * @Author: [email protected]
 * @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: [email protected]
 * @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后效率低

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

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

时间: 2024-10-06 23:23:52

单例--项目中用到单例的地方的相关文章

Spring单例Bean中注入多例Bean

问题: 当在一个单例Bean中注入一个多例Bean的时候,是获取不到那个多例对象的,因为,单例在初始化的时候,就直接初始化,这个多例Bean啦, 一直获取的是第一次初始化的Bean 配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="htt

struts2的action是多例,servlet是单例

struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的 属性不一样,操作得出的结果不一样.举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的 长度都是300cm,甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那 好,等甲做完上衣再做裤子的时候发现剩下的布(

设计模式中饿汉式单例类和懒汉式单例类

单例模式的特点为: *单例类只有一个实例. *单例类必须自己创建自己的唯一实例. *单例类必须给所有其他对象提供这一实例. 饿汉式单例类: 而饿汉式单例类则在java语言中是最为简单的单例类,这是一个描述饿汉式单例类的类图的实现. 此类图中,此类已经将自己实例化. 源码为: package singleton; public class EagerSingleton { private static EagerSingleton instance=new EagerSingleton(); /*

你研究过单例么?这样写单例效率最高.

首先,小汤我在这里,要表示一下歉意,本来是想要每天写一篇Swift的学习小tip的,无奈近期手头的money花差的差点儿相同了,仅仅能迫不得已,出门找工作去了,没能履行承诺之处还请大家见谅. 那么,废话不多说了,開始我们今天的主题: 单例 ! 单例介绍: 说到单例,大家应该都不陌生,在传说中的那23种 (为啥我就会6种捏o(╯□╰)o-) 设计模式中,单例应该是属于和简单工厂模式并列的最简单的设计模式了,也应该是最经常使用的. 像这样简单易懂,又能有效提高程序执行效率的设计模式,作为一个iOS程

Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式

package com.parllay.scala.bestpractive import scala.reflect.runtime.universe import scala.reflect.runtime.universe.typeOf import com.parllay.scala.bestpractive.Scala /** * Created by richard on 15-9-5. * 第79讲:单例深入讲解及单例背后的链式表达式 */ object Scala class J

单例模式(懒汉式单例、饿汉式单例、登记式单例)

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 注意: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点.

VC项目开发之单文档多视图实现-非分割窗口[转]

k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式 1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多. 2)通过一个文档关联多个视图,窗口显示整个视图. 第二种实现较第一种复杂,这里给出详细的实现方法. Step 1:使用VC 6.0新建一个Project,命名为:Mu

【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图

本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d-html5/1528.html ? 点击订阅 ? 本博客最新动态!及时将最新博文通知您! Cocos2dx html5开发,对于用过2d Or -x的童鞋来说非常easy,Himi这里也没有必要去再跟同学们具体的教学一遍. 所以Himi简单做了一个项目,供给大家參考,源代码下载地址及GIF截图在文章

DJANGO 学生管理系统项目创建流程 -- 单表管理

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; f