java中单例模式经典代码案例(饿汉式,懒汉式,静态内部类式,懒汉式反射和反序列化漏洞处理)

java中单例模式经典代码案例(饿汉式,懒汉式,静态内部类式,懒汉式反射和反序列化漏洞处理)

1.饿汉式单例模式(一上来就创建对象,饿的不行了)。

优点:线程安全,效率高。缺点:不能延时加载,占用资源

package com.liangrui.singletonMode;

/**
 * @program: study
 * @description: 饿汉式单例模式(一上来就创建对象,饿的不行了)。
 *              优点:线程安全,效率高。缺点:不能延时加载,占用资源
 * @author: 良睿
 * @create: 2021-10-28 15:58
 */
public class EvilHanStyle {
    //类初始化时加载对象,加载类,线程安全,但是会造成不必要的资源占用
    private static EvilHanStyle instance=new EvilHanStyle();

    //禁用构造器
    private EvilHanStyle(){
    }

    //获取单例对象的方法
    public static EvilHanStyle getInstance(){
        return instance;
    }
}

2.懒汉式单例模式(对象为空才创建对象,没有了才创建,不提前创建)

优点:实现了延时加载,避免资源占用。缺点:加入同步机制,效率低
此例子还防止了反射和反序列化漏洞

package com.liangrui.singletonMode;

import java.io.Serializable;

/**
 * @program: study
 * @description: 懒汉式单例模式(对象为空才创建对象,没有了才创建,不提前创建)。
 *              优点:实现了延时加载,避免资源占用。缺点:加入同步机制,效率低
 *             此例子还防止了反射和反序列化漏洞
 * @author: 良睿
 * @create: 2021-10-28 16:04
 */
public class LazyStyle implements Serializable {

    //初始化时不加载对象,实现延时加载
    private static LazyStyle instance;

    //禁用构造器
    private LazyStyle(){
        //如果对象不为空,则抛出运行时异常,防止了反射的漏洞导致创建新的对象
        if (instance!=null){
            throw new RuntimeException();
        }
    }

    //加入同步,避免多线程调用导致创建不同对象,也就导致效率低
    public static synchronized LazyStyle getInstance(){
        //对象为空时才创建,避免资源占用
        if (instance==null){
            instance=new LazyStyle();
        }
        return instance;
    }

    //添加此方法,返回对象,防止反序列化漏洞创建新对象
    private Object readResolve(){
        return instance;
    }
}

静态内部类式

优点:线程安全,效率高,实现了延时加载,避免不必要的资源占用,这种方式集合了饿汉式和懒汉式的优点

package com.liangrui.singletonMode;

/**
 * @program: study
 * @description: 静态内部类式单例模式
 *              优点:线程安全,效率高,实现了延时加载,避免不必要的资源占用,这种方式集合了饿汉式和懒汉式的优点
 * @author: 良睿
 * @create: 2021-10-28 16:19
 */
public class StaticInnerClassStyle {

    //创建内部内,实现创建对象
    private static class StaticInnerClassStyleInstance{
        //定义常量保证对象唯一
        private static final StaticInnerClassStyle instance=new StaticInnerClassStyle();
    }

    //禁用构造器
    private StaticInnerClassStyle(){

    }

    //不需要使用同步,效率高
    public static StaticInnerClassStyle getInstance(){
        return StaticInnerClassStyleInstance.instance;
    }
}

到此,java中单例模式经典代码案例已完成。有问题随时评论,觉得有用的话记得点个赞哦!

在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值