一见如故之java单例模式 singleton

     有人写文章用深入浅出或者通俗易懂来形容自己的文章,此时我这里一见如故再好不过了 ^_^
一见如故?

大多数java开发者,对于spring真的是不能在熟悉了,每次你的tomcat在启动后是不是会看见好多个singleton的字眼,好多开发者不会太在意这些东西,可是越深入越得知道这些基础的东西。在spring所有的bean缺省的生成方式是singleton,也就是说你所有的bean在你不指定scope的情况下都会是singleton(单例模式) 与之对应的原型模式我会在下次为大家说明。


一见如故之java单例模式 singleton_第1张图片
spring-bean4.xsd源文件.png

来一个实际中的场景 这里我将redis连接池使用了单例模式,哈哈默认也是单例只不过为了表述清楚而已


一见如故之java单例模式 singleton_第2张图片
bean.png

这样的场景,你会一见如故吗?
^^
常见的两种单例模式
    饿汉式与懒汉式

实现单例,先私有化类的构造器,这是就不会被实例化了

所谓饿汉式单例模式 看下面代码

//饿汉式  启动时就加载了实例
public class Singlet {

    private Singlet(){

    }
    //直接实例化了该对象,别人用时直接通过类名调用getInstance()
    //这样就实现了饿汉式,管你需不需要直接通过getInstance()得到
    private final static  Singlet singlet = new Singlet();
    
    //获取该类
    public static Singlet  getInstance(){

        return singlet;
    }


}

提到懒汉式单例模式 不能不一见如故了 又得引用spring bean了 嘿嘿


一见如故之java单例模式 singleton_第3张图片
image.png

接着看下spring-bean.xsd lazy-init的说明 默认不开启懒汉模式的 在spring中如果你开启了懒汉模式 以为着只有你使用这个bean时才会被初始化


一见如故之java单例模式 singleton_第4张图片
image.png

直接看代码 探探究竟

//懒汉式  当有访问时才加载实例
public class Singlet2 {

    private Singlet2(){

    }
    //这里类变量初始空引用 
    private static Singlet2 singlet2 = null;
    //调用此方式时有个逻辑判断 有实例则直接返回类变量 没有则实例化该类 真正实现了懒加载
    public static Singlet2 getSinglet2(){

        //进行的这步内容会发生线程安全问题 并发情境下  故不考虑
       /* if(singlet2==null){
            singlet2 = new Singlet2();
        }*/
       if(singlet2 == null){
           synchronized (Singlet2.class){
               singlet2 = new Singlet2();
           }
       }

        return  singlet2;
    }

}

一见如故,我是FirmJack

你可能感兴趣的:(一见如故之java单例模式 singleton)